2010-11-14 20 views
3

Voici un échantillon du XML je travaille avec (accessibles à partir spéciales tout wiki: Exporter les résultats/UnePage):XPathNavigator aide

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en"> 
    <siteinfo> 
    <sitename>Wikipedia</sitename> 
    <base>http://en.wikipedia.org/wiki/Main_Page</base> 
    <generator>MediaWiki 1.16wmf4</generator> 
    <case>first-letter</case> 
    <namespaces> 
     <namespace key="-2" case="first-letter">Media</namespace> 
     <namespace key="-1" case="first-letter">Special</namespace> 
     <namespace key="0" case="first-letter" /> 
     ... 
    </namespaces> 
    </siteinfo> 
</mediawiki> 

J'ai tout essayé, je peux penser à « sauter » directement au nœud siteinfo et itérer les résultats, et rien ne fonctionne à moins que je navigue manuellement à travers chaque nœud enfant de la racine vers le bas. J'ai essayé un million de variations des différents .Amener * et * .select méthodes et il semble que je suis juste frapper ma tête contre un mur, mais ma variante actuelle ressemble à ceci:

StringReader strr = new StringReader(_rawData); 
XPathDocument xd = new XPathDocument(XmlReader.Create(strr, Bot.XmlReaderSettings)); 
XPathNavigator xn = xd.CreateNavigator(); 
XPathNodeIterator xni = xn.Select("/mediawiki/siteinfo"); 
foreach (XPathNavigator nav in xni) 
    Console.WriteLine(nav.LocalName); 

Ce retourne pas résultats. Qu'est-ce que je fais mal?

Répondre

9

Bienvenue dans les espaces de noms XML. Vous devez créer un mappage entre un préfixe et le xmlns de l'élément racine. Par exemple, ce code a fonctionné pour moi:

using (var r = File.OpenText("test.xml")) { 
    XPathDocument xd = new XPathDocument(XmlReader.Create(r)); 
    XPathNavigator xn = xd.CreateNavigator(); 

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xn.NameTable); 
    nsmgr.AddNamespace("mw", "http://www.mediawiki.org/xml/export-0.4/"); 

    XPathNodeIterator xni = xn.Select("/mw:mediawiki/mw:siteinfo", nsmgr); 

    foreach (XPathNavigator nav in xni) 
     Console.WriteLine(nav.Name); 
} 

Pour en savoir plus, dans le cas où vous êtes intéressé: MSDN: XML Namespaces and How They Affect XPath and XSLT.

+0

Excellent, merci pour le code et le lien! – RobinHood70

+0

+1 Bonne réponse. –

+0

Pour ajouter des points bonus, est-il possible de déterminer l'url pour l'espace de nom via XPathNavigator, ou devrais-je simplement utiliser un Regex, puisque j'ai déjà la chaîne au préalable? – RobinHood70