2009-07-28 6 views
3

j'ai un fichier XML qui a la structure suivante:C# et XPath - comment interroger

<mediawiki ...> 
    <siteinfo>...</siteinfo> 
    <page> 
    <title>The Title</title> 
    <id>42</id> 
    ... 
    </page> 
    ... more page items ... 
</mediawiki> 

I rouge un peu requête_xpath et écrit le code suivant:

_xmlArticlesDocument = new XmlDocument(); 
_xmlArticlesDocument.Load(xmlArticlesFileName); 

Maintenant, je veux avoir une prise sur un élément de page avec un id-sous-élément donné. Donc j'ai écrit:

XmlNode node = _xmlArticlesDocument.DocumentElement.SelectSingleNode 
       ("//mediawiki/page[id=" + id.ToString() + "]"); 

mais le noeud est toujours nul. J'ai essayé plusieurs requêtes, y compris "page/id", "page", "/ page", "// page" pour obtenir quoi que ce soit, mais le noeud est toujours nul. J'ai vérifié par l'inspection rapide la variable _xmlArticlesDocument et il contient le fichier XML correct avec la structure attendue.

Il me semble que j'ai manqué quelque chose de très basique, mais je n'ai aucune idée de quoi. Peut-être que quelqu'un ici a une idée?

Merci à l'avance, Frank

Répondre

5

La requête semble juste sur la base de ce que vous nous avez montré jusqu'à présent. Cependant je suspecte behin le "..." sur l'élément de mediawiki il y a un attribut de xmlns = "...." juste?

Ce sera ce qui vous tracasse je soupçonne. Vous aurez besoin d'un code comme celui-ci: -

XmlNamespaceManager nsmgr = new XmlNamespaceManager(_xmlArticlesDocument.NameTable); 
nsmgr.AddNamespace("a", "the-namespace-in-them-xmlns-attribute"); 
XmlNode page = _xmlArticlesDocument.SelectSingleNode(String.Format("//a:page[id={0}]", id), nsmgr); 
+0

C'est la voie à suivre, j'ai eu beaucoup de problèmes avec cela, mais une fois que vous avez compris cela, c'est facile. :) –

+0

Frapper le clou sur la tête! Le problème était le manquant namespacemanager, qui n'a pas été mentionné dans le tutoriel I rouge. Un petit changement dans la requête est nécessaire, car l'élément id est également dans l'espace de nommage: "a: page [a: id =" + id.toString() + "]" fait le bon travail. Merci beaucoup! – Aaginor

3

Avez-vous essayé:

_xmlArticlesDocument.DocumentElement.SelectSingleNode 
       ("page[id='" + id.ToString() + "']"); // Note the single quotes 

De plus, si l'un des nœuds XML sont dans un espace de noms qui ne sont pas celui par défaut (c.-à-<mediawiki xmlns="whatever">), alors vous êtes va également avoir besoin d'un XmlNamespaceManager.

+0

Le // devrait déplacer la requête au début du document. – AnthonyWJones

+0

Je n'ai pas suggéré d'utiliser le // ... ou je ne comprends pas votre point de vue? –

+0

N'oubliez pas de vérifier/vérifier que 'id' ne contient pas de guillemets simples, ou' SelectSingleNode() 'échouera à cause d'un XPath invalide. – Tomalak

2

Vérifiez Linq to XML. Je suis également un XML, et je trouve que c'est plus facile, XMLDocument.

+0

J'allais simplement suggérer cela aussi. Si vous ne connaissez pas XPath et n'en avez besoin que pour analyser XML via C# .Net, Linq to XML est la solution à adopter. – Kon

+0

Je serais d'accord que si vous n'avez pas XPath sous votre ceinture, vous pourriez trouver l'approche de LINQ mieux puisque les compétences sont plus transférables. – AnthonyWJones

+0

Ah, je pense que cela pose des problèmes. Après avoir rassemblé les morceaux, cela me semble très intuitif. Et avec cette communauté géniale ici à StackOverflow, ces problèmes de démarrage ne seront pas non résolus pour longtemps;) – Aaginor