Par rapport XPath noeud sélection avec C# XmlDocument
Imaginer le document XML suivant:
<root>
<person_data>
<person>
<name>John</name>
<age>35</age>
</person>
<person>
<name>Jim</name>
<age>50</age>
</person>
</person_data>
<locations>
<location>
<name>John</name>
<country>USA</country>
</location>
<location>
<name>Jim</name>
<country>Japan</country>
</location>
</locations>
</root>
Je puis sélectionnez la personne nœud de Jim:
XmlNode personNode = doc.SelectSingleNode("//person[name = 'Jim']");
Et maintenant, à partir de ce nœud avec un seul XPath sélectionnez je tiens à le récupérer Jim emplacement du nœud. Quelque chose comme:
XmlNode locationNode = personNode.SelectSingleNode("//location[name = {reference to personNode}/name]");
Depuis que je suis à la sélection des basé sur le personNode il serait pratique si je pouvais y faire référence dans le sélectionner. Est-ce possible?.. la connexion est là?
Sûr que je pourrais mettre dans un supplément de quelques lignes de code et de mettre le nom dans une variable et l'utilise dans le XPath chaîne mais ce n'est pas ce que je demande.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas très efficace, mais il devrait fonctionner. Plus le fichier est la plus lente est ce que ce sera.
Ici, c'est pourquoi c'est inefficace:
//
" raccourci provoque un document à l'échelle de numérisation de tous les nœuds.[]
" prédicat s'exécute dans une boucle, une fois pour chaque<person>
appariés par "//person
".//
" provoque un provoque un document à l'échelle de scanner à nouveau, cette fois pour chaque<person>
.Cela signifie que vous obtenez quadratique O(n2) le pire des cas, les performances, ce qui est mauvais. S'il y a n
<person>
s et n<location>
s dans votre document, x n n document à l'échelle des scans de se produire. Tout d'un innocent à la recherche de l'expression XPath.Que je recommanderais à l'encontre de cette approche. Deux étapes de sélection (tout d'abord, trouver la personne, puis l'emplacement) ont un meilleur rendement.
Vous n'êtes pas la sélection de la
location
nœud basé sur laperson
nœud, plutôt de la sélection sur la base de la valeur du nœud. La valeur est une chaîne, et dans ce cas, il peut être utilisé pour formuler un prédicat d'état qui sélectionne leslocation
nœud basée sur la valeur à l'intérieur ("Jim").Je ne suis pas très sûr de savoir pourquoi vous voulez consulter l'emplacement de
personNode
. Depuis, le nom existe déjà danslocation
nœud, vous pouvez très bien l'utiliser pour obtenir l'emplacement du nœud correspondant 'Jim'.Devrait le faire.
J'apprécie que votre véritable document XML est plus complexe que l'exemple, mais une chose ne me frappe à ce sujet. Il ressemble à un magasin de données relationnelles, contenant les éléments suivants:
person
tableau avec deux colonnes -name
etage
.location
tableau avec deux colonnes -name
etcountry
.name
colonnes.Avec cela à l'esprit, l'expression XPath, devient évident. Il vous suffit de sélectionner sur la valeur de clé primaire de la table dont vous souhaitez.
Je sais que aJ déjà proposé cette solution, et elle a été rejetée, mais si vous généraliser l'idée de la véritable schéma XML, vous obtenez ceci:
En d'autres termes: