Utilisation de XPath dans SelectSingleNode: Récupération élément individuel à partir de XML si elle est présente

StackOverflow https://stackoverflow.com/questions/883698

  •  22-08-2019
  •  | 
  •  

Question

Mon XML ressemble à:

<?xml version=\"1.0\"?>
<itemSet>
       <Item>one</Item>
       <Item>two</Item>
       <Item>three</Item>
       .....maybe more Items here.
</itemSet>

Certains de l'individu Point peut ou non être présent. Dire que je veux récupérer l'élément <Item> deux </Item> si elle est présente. J'ai essayé les XPath suivantes (en C #).

  • XMLNode node = myXMLdoc.SelectSingleNode("/itemSet[Item='two']") --- Si l'élément deux est présent, il me revient que le premier élément un . Peut-être que cette requête des points juste pour le premier élément itemset, si elle a un objet de valeur deux quelque part comme un enfant. Cette interprétation est correcte?

J'essayé:

  • XMLNode node = myXMLdoc.SelectSingleNode("/itemSet[Item='two']/Item[1]") --- J'ai lu cette requête comme, revenez me voir le premier <Item> élément dans itemset qui a une valeur = 'deux'. Ai-je raison?

Ceci retourne encore que le premier élément un . Qu'est-ce que je fais mal? Dans les deux cas, en utilisant les frères et sœurs, je peux parcourir les nœuds enfants et arriver à deux , mais ce n'est pas ce que je regarde. Aussi, si deux est absent puis retourne SelectSingleNode nulle. Ainsi, le fait que je reçois un nœud de retour Successfull n'indique la présence de l'élément deux, donc si j'avais voulu un test booléen à la présence chk de deux , l'un des XPath ci-dessus devraient suffire, mais je en fait le besoin de l'élément complet <Item>two</Item> comme mon noeud de retour.

[Ma première question ici, et mon premier temps de travail avec la programmation web, donc je viens d'apprendre les XPath ci-dessus et des trucs xml liés à la volée en ce moment des questions passées en SO. Alors, soyez doux, et laissez-moi savoir si je suis un crétin ou bafouer les règles communautaires. Merci.]

Était-ce utile?

La solution

Je pense que vous voulez:

myXMLdoc.SelectSingleNode("/itemSet/Item[text()='two']")

En d'autres termes, vous voulez que le Point qui a le texte de deux, pas itemSet contenant.

Vous pouvez également utiliser un seul point pour indiquer le nœud de contexte, dans votre cas:

myXMLdoc.SelectSingleNode("/itemSet/Item[.='two']")

EDIT: La différence entre . et text() est que . signifie « ce nœud » efficace et text() signifie « tous les enfants de noeud texte de ce noeud ». Dans les deux cas, la comparaison sera contre la « valeur de chaîne » de la LHS. Pour un nœud d'élément, la chaîne de valeur est « la concaténation de la chaîne des valeurs de tous les descendants de noeud texte du noeud d'élément dans l'ordre du document » et pour une collection de nœuds de texte, la comparaison vérifie si un nœud de texte est égal à celui que vous testez contre.

Il n'a pas d'importance lorsque le contenu de l'élément n'a qu'un nœud texte unique, mais supposons que nous avions:

<root>
  <item name="first">x<foo/>y</item>
  <item name="second">xy<foo/>ab</item>
</root>

Alors une expression XPath de « root/item[.='xy'] » correspondra au premier élément, mais « root/item[text()='xy'] » correspondra à la seconde.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top