2011-06-29 6 views
2

J'ai un fichier xml et j'essaie d'obtenir une liste de tous les nœuds en utilisant C#.Quel est le problème avec mon Xpath?

Un coupé vers le bas version de mon xml est:

<file> 
    <AnotherNode> 
    </AnotherNode> 
    <ROWS> 
     <row> 
      <code>Code1</code> 
      <R>1</R> 
      <G>2</G> 
      <B>3</B> 
     </row> 
     <row> 
      <code>Code2</code> 
      <R>1</R> 
      <G>2</G> 
      <B>3</B> 
     </row> 
    </ROWS> 
</file> 

Il y a plusieurs noeuds « rangée » et je veux une liste de tous les codes de l'intérieur de ces noeuds

Le XPath que je utilise est :

/file/ROWS/row/code 

avec ce code:

XmlDocument doc = new XmlDocument(); 
doc.Load(xml); 
XmlNode root = doc.DocumentElement; 
XmlNodeList nodeList = root.SelectNodes(xpath here); 
foreach (XmlNode code in nodeList) 
{ 
} 

mais je ne retourne aucun noeud.

Qu'est-ce que je fais mal?

Merci.

+1

Veuillez montrer un programme court mais * complet * et un fichier XML affichant le problème. Souvent, les problèmes XPath sont causés par des problèmes d'espace de noms, que nous ne verrons peut-être pas dans votre version "réduite". –

+0

Votre expression XPath indique que '' est l'élément de document. Est-ce vraiment le cas? –

+0

Votre 'xpath' fonctionne bien pour moi. Je suggère donc que c'est votre C#, mais je ne peux pas vous aider là-bas. – MattH

Répondre

0

Solution et suggestion si vous utilisez au moins .net 3.5.

XDocument xdoc = XDocument.Load("XMLFile1.xml"); 
foreach (XElement element in xdoc.XPathSelectElements("//file/ROWS/row/code")) 
{ 

} 

Assurez-vous d'inclure "using System.Xml.XPath;"

3

Supprimez la ligne suivante à partir de votre code:

root.InnerText = root.InnerText.ToLower(); 

Cela crée un fichier XML avec tous les tags en minuscules et votre XPath qui est correct pour les noms d'étiquette d'origine ne fonctionne plus.

+0

oups, ce n'est pas le problème, j'ai essayé de le faire pour utiliser un xpath minuscule (qui n'a toujours pas fonctionné) Édité – Bex

+2

@Bex: Et c'est précisément le genre de raison pour laquelle un programme court mais complet est utile. Cela signifie que tout le monde traite avec le même code, ayant éliminé les bêtises. –

0

Essayez de supprimer cette ligne de code:

root.InnerText = root.InnerText.ToLower(); 

J'essayé de convertir votre XPath en minuscules et en laissant cette ligne, mais remettre à zéro le root.InnerText semble détruire la structure du document XML (pas à pas dans le code dans le débogueur modifie la propriété root.ChildNodes.Count de 2 à 1 après l'exécution de la ligne ci-dessus).

0

Votre requête fonctionnerait si vous aviez la structure suivante XML:

<code> 
    <R>1</R> 
    <G>2</G> 
    <B>3</B> 
</code> 

où R, G, B sont sous-noeuds de code.

Mais dans votre cas, R, G, B, ainsi que le code sont sous-noeuds de rang:

<row> 
    <code> </code> 
    <R>1</R> 
    <G>2</G> 
    <B>3</B> 
</row> 

Alors requête file/ROWS/row/*[not(self::code)] recueillera toutes les valeurs R, G, B (tous les nœuds secondaires de rang, sauf code) .

Et appelez doc.SelectNodes(), pas doc.DocumentElement.SelectNodes()!