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

この問題に対処するには、次の 2 つのことを行う必要があります。

1.) XML の形式が正しくありません。XML では大文字と小文字が区別され、閉じ括弧が必要になるなどの点に注意してください。上記の XML には多数のエラーがあります。具体的には次のとおりです。

を。タグ 'Invoice_ID' を開き、タグ 'Invoice_Id' を閉じます (<Invoice_ID> ... </Invoice_ID> である必要があります)。

b. タグ 'City' を開き、タグ 'city' を閉じます (<City> ... </City> である必要があります)。

c. 要素 'State' の終了タグ (</State> である必要があります) に右山かっこ '>' がありません。

d. タグ「Zip」を開き、タグ「zip」を閉じます (<Zip> ... </Zip> である必要があります)。

e. 「Amount」の 2 つの開始タグ (<Amount> ... <Amount>); 開始タグと終了タグ (<Amount> ... </Amount>) である必要があります。

f. 最初の 'item' 要素の終了タグがありません。(</item> を追加)。

g. タグ 'Total' を開き、タグ 'total' を閉じます (<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 を修正したら、すべての「請求書」要素を選択し、その子要素 ​​(「名前」など) にアクセスします。最初にすべての「請求書」要素を選択してから、それぞれを繰り返し、アクセスします。必要に応じて必要な子要素 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")

ただし、下位の子孫の値を取得するためにさらに深く掘り下げたい場合は、SelectSingleNodeまたはSelectNodesを使用して、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 に答える