2011-09-14 6 views
0

J'ai un document XML:Comment sélectionner un nœud spécifique à l'aide de System.Xml?

<Item> 
    <ID>1</ID> 
    <Title>Title1</Title> 
    <Rank>1</Rank> 
</Item> 
<Item> 
    <ID>2</ID> 
    <Title>Title2</Title> 
    <Rank>2</Rank> 
</Item> 

Ce document a dix points, le problème que j'ai est que je sélectionne l'ID Title2 2 et Rang 1.

for (int i = 0; i < 10; i++) 
{ 
     XmlNode titleNode = doc.GetElementsByTagName("Title", NAMESPACE).Item(i); 
     XmlNode asinNode = doc.GetElementsByTagName("ID", NAMESPACE).Item(i); 
     XmlNode SalesNode = doc.GetElementsByTagName("SalesRank", NAMESPACE).Item(i); 
} 

Voici comment Je charge le document.

  WebRequest request = HttpWebRequest.Create(url); 
      WebResponse response = request.GetResponse(); 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(response.GetResponseStream()); 
+3

Je voudrais que les gens commencer à utiliser 'System.Xml.Linq'. Chaque fois que je vois des gens qui luttent avec l'horrible API 'System.Xml', je perds une seule larme. Aussi, je ne vois pas d'XPATH utilisé ici. – ChaosPandion

+0

Qu'est-ce que la boucle est censée accomplir exactement? Ce n'est pas la meilleure façon d'itérer sur un ensemble de nœuds XML. – Oded

+0

@Oded J'ai dix éléments que je veux mettre à jour dans ma base de données, autre que d'écrire le code dix fois ce qui serait le moyen d'obtenir dix éléments? –

Répondre

0

Vous pouvez utiliser la sérialisation (dé) XML: Créez simplement une classe rapide pour Item. échantillon complet dans XmlSerializer.Deserialize() docs.

Bien sûr, ce n'est qu'une parmi de nombreuses techniques pour analyser XML (XPath, Linq en XML, ...). Faites votre choix.

-1

Voici un exemple de travail utilisant XPath qui, je crois, est ce dont vous avez vraiment besoin.

let doc = XmlDocument() 
doc.LoadXml ("<As><A><B>1</B></A><A><B>2</B></A></As>") 
let n = doc.SelectSingleNode("As/A[B/text() = '1']") 
+0

J'ai ajouté comment je charge réellement le document –

+0

Le processus de chargement n'est pas pertinent. Le XML peut être chargé de n'importe quelle façon; C'est la méthode de sélection des nœuds qui est en jeu ici. –

1
XmlNode node = doc.SelectSingleNode("/Item[ID='"+i.ToString()+"']"); 
XmlNode titleNode = node.SelectSingleNode("Title"); 
XmlNode asinNode = node.SelectSingleNode("ID"); 
XmlNode rankNode = node.SelectSingleNode("Rank"); 
+0

Si vous voulez quelque chose d'un peu plus performant, changez votre XmlDocument pour un XPathDocument et naviguez à la place. Beaucoup plus vite, mais c'est en lecture seule. –

+0

Le noeud est nul en essayant de le sélectionner de cette façon. –

+0

Ce serait le cas si votre code XML avait un autre niveau au-dessus de ce qui est affiché (vous avez probablement un élément racine autour des deux éléments). Modifiez les éléments ci-dessus pour inclure a/et ensuite quel que soit l'élément conteneur appelé au début de ce premier SelectSingleNode xpath ou modifiez le premier/à // pour choisir les éléments indépendamment de leur profondeur (plus lent et sujet aux problèmes si Item peut contenir autres éléments de l'article). –

Questions connexes