2010-11-13 35 views
2

Quelle est la différence en utilisant le nœud racine pour sélectionner et utiliser l'objet document pour sélectionner les nœuds? Quel chemin est préféré.XmlDocument.SelectNodes question

Par exemple,

1.

XmlDocument Doc = new XmlDocument(); 
Doc.Load(mem); 

XmlNodeList nodeList = Doc.SelectNodes(@"//@id"); 

2.

XmlDocument Doc = new XmlDocument(); 
Doc.Load(mem); 

XmlElement root = Doc.DocumentElement; 

XmlNodeList nodeList = root.SelectNodes(@"//@id"); 

Répondre

1

En fait, je ne ai jamais eu aucune différence. Et simplement utiliser

Doc.SelectNodes(@"//@id"); 

parce que si la racine du document existe

bool b = Doc.OuterXml == Doc.DocumentElement.OuterXml; // true 
+1

Bien que les documentations suggèrent que s'il n'y a pas d'élément racine, 'Doc.DocumentElement' renverra' null', ainsi la deuxième liste sur l'OP peut trow une 'NullReferenceException'. Je suis d'accord avec vous, cependant. – Oded

+0

@ user496949: Heureux que ça a aidé! :) – abatishchev

1

Depuis XPath de // expression correspond toujours à partir de la racine du document, le résultat sera le même si vous commencez à partir de la racine du document ou de son documentElement.

Donc je suppose que vous êtes mieux d'utiliser la syntaxe plus courte Doc.SelectNodes("//@id");.

+0

Dans la mesure où la racine du document existe 'Doc.OuterXml = Doc.DocumentElement.OuterXml' je pense que toute requête retournera le même résultat, XPath ou autre – abatishchev

+0

@abatishchev, pas toujours. Par exemple, considérons le document '' et l'expression XPath 'root'. Cela ne correspondra à rien s'il est appelé depuis l'élément document. –

+0

édéric: En effet. Tu as raison. Merci! – abatishchev

1

La racine d'un document XML contient au moins son élément de document, mais il peut également contenir des instructions de traitement et des commentaires. Par exemple, dans ce document XML:

<!-- This is a child of the root --> 
<document_element> 
    <!-- This is a child of the document element --> 
<document_element> 
<!-- This is also a child of the root --> 

la racine a trois nœuds enfants, dont l'un est son élément de niveau supérieur. Dans ce cas, ceci:

XmlNodeList comments = doc.SelectNodes("comment()"); 

et ceci:

XmlNodeList comments = doc.DocumentElement.SelectNodes("comment()"); 

retour des résultats totalement différents.