0

我正在尝试解析以下 Xml。它可能有多个发票标签:

<Invoices>
    <Invoice>
        <Invoice_ID>1234</Invoice_Id>
        <Billing>
            <Name> abc </Name>
            <Address1>1 main street</Address1>
            <City> city </city>
            <State>State </State
            <Zip>00000</zip>
            <Amount>
                <BaseAmt>35</BaseAmt>
                <Tax>3</Tax>
                <Total>28<total>
            <Amount>
        </Billing>      
        <item>
                 <Name> pen </Name>
                 <qty> 5 </qty>
                 <amount> 10 </amount>
        </item> 
        <item>
            <Name> Paper </Name>
                 <qty> 3 </qty>
                 <amount> 20 </amount>
        </item>                                 
        </Invoice>
</Invoices>

下面是我的代码:

Dim xmlDoc As XmlDocument = New XmlDocument()
xmlDoc.Load(fileName)
Dim invNum As Integer = 0
Dim nodeLst As XmlNodeList = xmlDoc.SelectNodes("/Invoices/Invoice")
invNum = nodeLst.Count

For Each invDetail As XmlElement In nodeLst
    Dim invID As String = invDetail("Invoice_ID").InnerText.ToString()
Next

我需要获取剩余标签的值,即子节点,例如 Billing/Name 、 Billing/Name/Amount 、 Items/Items/Name

4

2 回答 2

2

解决这个问题需要做两件事:

1.) 您的 XML 格式不正确。请记住,XML 区分大小写,需要右括号等;上面的 XML 中有很多错误 - 特别是:

一种。打开标签“Invoice_ID”并关闭标签“Invoice_Id”(应为 <Invoice_ID> ... </Invoice_ID>)。

湾。打开标签“城市”并关闭标签“城市”(应该是 <City> ... </City>)。

C。元素“State”在其结束标记上缺少一个直角括号“>”(应该是 </State>)。

d。打开标签“Zip”并关闭标签“zip”(应该是 <Zip> ... </Zip>)。

e. 'Amount' 的两个开放标签(<Amount> ... <Amount>);应该是打开和关闭标签(<Amount> ... </Amount>)。

F。您缺少第一个“项目”元素的结束标记。(添加</item>)。

G。打开标记“总计”并关闭标记“总计”(应为 <Total>...</Total>)。

修复后的 XML 如下所示:

<Invoices>
    <Invoice>
        <Invoice_ID>1234</Invoice_ID>
        <Billing>
            <Name> abc </Name>
            <Address1>1 main street</Address1>
            <City> city </City>
            <State>State </State>
            <Zip>00000</Zip>
            <Amount>
                <BaseAmt>35</BaseAmt>
                <Tax>3</Tax>
                <Total>28</Total>
            </Amount>
        </Billing>      
        <Items>
            <item>
                <Name> pen </Name>
                <qty> 5 </qty>
                <amount> 10 </amount>
            </item>
            <item>
                <Name> Paper </Name>
                <qty> 3 </qty>
                <amount> 20 </amount>
            </item>                                         
        </Items>
    </Invoice>
</Invoices>

2.)修复 XML 后,选择所有“Invoice”元素并访问其子元素(例如“Name”等) - 您可以首先选择所有“Invoice”元素,然后遍历每个元素,访问您需要的子元素 InnerText/values 视情况而定。

XmlNodeList nodeList = doc.SelectNodes("//Invoice");

foreach (XmlNode invoice in nodeList)
    Console.WriteLine(invoice.SelectSingleNode("Billing/Name").InnerText);

上面的输出将显示为:

abc

希望这可以帮助。

于 2013-09-03T22:21:22.483 回答
1

如果您只是访问直接子元素的值,例如Invoice_ID,您可以使用索引器按名称访问子元素,就像您已经在做的那样,如下所示:

invDetail("Invoice_ID")

但是,如果您想更深入地获取较低后代的值,您可以使用SelectSingleNodeSelectNodes通过 XPath 访问该节点。XPath 将相对于当前节点。例如:

For Each invDetail As XmlElement In nodeLst
    Dim invID As String = invDetail("Invoice_ID").InnerText
    Dim name As String = invDetail.SelectSingleNode("Billing/Name").InnerText
    ' etc.
    For Each item As XmlElement In invDetail.SelectNodes("item")
        Dim itemName As String = item("Name").InnerText
        ' etc.
    Next
Next
于 2013-09-03T21:02:21.393 回答