2013-09-03 4 views
0

J'essaye d'analyser le Xml ci-dessous. Il pourrait avoir plusieurs balises de facture:Analyser XML en utilisant XmlDocument

<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> 

Ci-dessous mon code:

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 

je dois obtenir la valeur pour les autres balises à savoir les nœuds enfants comme la facturation/Nom, facturation/Nom/Montant, articles/articles/nom

+0

Quel problème avez-vous? –

+0

J'ai reçu l'invID en utilisant invDetail ("Invoice_ID) .InnerText mais quand j'essaye d'obtenir le nom comme invDetail.SelectSingleNode (" Facturation/Nom ") il me donne l'erreur disant" Référence d'objet non définie à l'instance du object " – user565992

+0

" Facturation/Nom "n'est pas un nom Vous avez besoin de' SelectSingleNode ("Billing") ', puis' SelectSingleNode ("Name") 'sur ceci –

Répondre

1

Si vous accédez simplement la valeur d'un élément enfant direct, comme Invoice_ID, vous pouvez utiliser l'indexeur pour accéder à l'élément enfant par son nom, comme vous le faites déjà, comme ceci:

invDetail("Invoice_ID") 

Cependant, si vous voulez aller plus loin pour obtenir la valeur d'un descendant inférieur, vous pouvez utiliser SelectSingleNode ou SelectNodes pour accéder au noeud via XPath. Le XPath sera relatif au nœud actuel. Par exemple:

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 
+0

J'ai reçu l'invID en utilisant invDetail (" Invoice_ID) .InnerText quand j'essaye d'obtenir le nom comme invDetail.SelectSingleNode ("facturation/nom") il me donne l'erreur en disant "la référence d'objet non définie à l'instance de l'objet" – user565992

+0

Je l'ai juste testé et cela fonctionne pour moi. J'ai mis à jour ma réponse pour montrer mon code. Il doit y avoir quelque chose d'autre avec votre code ou votre XML. Si vous ne pouvez pas le comprendre, veuillez mettre à jour votre question avec un exemple réel de XML qui échoue (l'exemple actuel n'est pas bien formé, donc ce n'est évidemment pas le vrai que vous testez) et le code exact qui échoue . –

+0

Merci Steven Doggart, j'ai corrigé cette erreur et j'ai pu obtenir la valeur. Je suis incapable de mettre le Xml réel pour des raisons de confidentialité.Une dernière chose que j'ai besoin d'aide est que dans mon XMl ci-dessus, vous voyez des éléments tag, comment puis-je les boucler comme je suis déjà dans le pour chaque boucle. – user565992

2

Deux choses doivent faire pour résoudre ce problème:

1.) Votre XML est pas bien formé. Rappelez-vous que XML est sensible à la casse, nécessite des crochets de fermeture, etc .; il y a de nombreuses erreurs dans votre XML ci-dessus - spécifiquement:

a. Ouvrez la balise "ID_Facture" et fermez la balise "ID_facture" (doit être <ID_facture> ... </Facture_ID >).

b. Ouvrir la balise "Ville" et fermer la balise "ville" (devrait être <Ville> ... </Ville >).

c. L'élément 'State' manque un crochet d'angle droit '>' sur sa balise de fermeture (doit être </State >).

d. Ouvrir la balise 'Zip' et fermer la balise 'zip' (devrait être <Zip> ... </Zip >).

e. Deux étiquettes ouvertes pour 'Quantité' (< Quantité > ... < Quantité >); doit être ouvert et fermé étiquette (<Amount> ... </Quantité >).

f. Il vous manque une balise de fermeture pour le premier élément 'item'. (ajouter </article >).

g. Ouvrir l'étiquette 'Total' et fermer l'étiquette 'total' (devrait être < Total ... </Total >).

Le XML retapent ressemblera comme suit:

<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. Une fois que vous avez réparé votre XML, pour sélectionner tous les éléments 'Invoice' et accéder à leurs éléments enfants (tels que 'Name', etc.) - vous pouvez d'abord sélectionner tous les éléments 'Invoice', puis parcourir chaque élément enfant InnertText/valeurs dont vous avez besoin selon le cas.

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

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

La sortie de la ci-dessus serait lu:

abc 

Hope this helps.

Questions connexes