Question

J'utilise XPath dans .NET pour analyser un document XML, dans le sens de :

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff");

foreach (XmlNode stuff in lotsOStuff) {
   XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild");
   // ... etc
}

Le problème est que la requête XPath pour stuffChild renvoie toujours l'enfant du premier stuff élément, jamais le reste.XPath ne peut-il pas être utilisé pour interroger un individu XMLElement?

Était-ce utile?

La solution

// au début d'une expression XPath commence à la racine du document.Essayez ".//stuffChild"..est un raccourci pour self::node(), qui définira le contexte de la recherche, et // est un raccourci pour l'axe descendant.

Vous avez donc :

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");

ce qui se traduit par :

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");

Dans le cas où le nœud enfant pourrait avoir le même nom que le parent, vous souhaiterez utiliser la syntaxe légèrement plus détaillée qui suit, pour vous assurer de ne pas resélectionner le parent :

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

Notez également que si « stuffChild » est un descendant direct de « stuff », vous pouvez complètement omettre les préfixes et simplement sélectionner « stuffChild ».

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

Le W3Écoles Le didacticiel contient des informations utiles dans un format facile à digérer.

Autres conseils

Le // tu utilises devant stuffChild signifie que tu cherches stuffChild éléments, en commençant par la racine.

Si vous souhaitez partir du nœud actuel (descendants du nœud actuel), vous devez utiliser .//, un péché:

stuff.SelectSingleNode(".//stuffChild");

Si "stuffChild" est un nœud enfant de "stuff", alors votre XPath devrait simplement être :

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

La sélection d’un seul nœud signifie que vous n’avez besoin que du premier élément.La meilleure solution est donc :

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top