2010-07-13 7 views
0

Je dois obtenir certains nœuds (leur InnerText) à partir d'un fichier XML. Je connais leurs noms, mais les nœuds utilisent peut-être des espaces de noms que je ne connais pas. Est-il possible d'obtenir un nœud en utilisant SelectSingleNode() ou une autre méthode sans connaître l'espace de noms utilisé par le nœud? Est-il possible d'ignorer les espaces de noms que les nœuds utilisent?Obtenir un seul nœud sans connaître son espace de noms

Répondre

3

Utilisez namespace-agnostic XPath. Pas particulièrement agréable ou efficace, mais ça marche.

Au lieu de cela:

/ns1:foo/ns2:bar/ns3:baz

utiliser ceci:

/*[local-name() = 'foo']/*[local-name() = 'bar']/*[local-name() = 'baz']

Soyez prêt à faire face aux conséquences de namespaces perdre:

<ns1:foo> 
    <wrong:bar> 
    <wrong:baz /> <!-- this would be selected (false positive) --> 
    </wrong:bar> 
    <ns2:bar> 
    <ns3:baz /> 
    </ns2:bar> 
</ns1:foo> 
0
XmlDocument doc = new XmlDocument(); 
doc.Load("foo.xml"); 

XmlElement b, f1, f2; 

b = (XmlElement)doc.SelectSingleNode("//bar"); 
f1 = (XmlElement)b.SelectSingleNode("ancestor::foo[1]"); 
f2 = (XmlElement)b.SelectNodes("ancestor::foo")[0]; 

Console.WriteLine(f1.GetAttribute("depth")); 
Console.WriteLine(f2.GetAttribute("depth")); 
Questions connexes