Supposons que j'ai le XML suivant:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
Je voudrais faire un xpath qui récupère tous les nœuds de livre qui ont un nœud de titre avec un attribut de langue "it".
Ma tentative ressemblait à ceci:
//book[title[@lang='it']]
Mais cela n'a pas fonctionné. J'espère récupérer les nœuds:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
Des indices?
Réponses:
Essayer
Cela se lit:
book
élémentstitle
lang
"it"
Vous trouverez peut-être cela utile - c'est un article intitulé "XPath en cinq paragraphes" de Ronald Bourret.
Mais en toute honnêteté,
//book[title[@lang='it']]
et ce qui précède devrait être équivalent, à moins que votre moteur XPath ait des «problèmes». Il peut donc s'agir d'un élément du code ou de l'exemple XML que vous ne nous montrez pas - par exemple, votre exemple est un fragment XML. Se pourrait-il que l'élément racine ait un espace de noms et que vous ne comptez pas pour cela dans votre requête? Et vous nous avez seulement dit que cela n'a pas fonctionné, mais vous ne nous avez pas dit quels résultats vous aviez obtenus.la source
title
n'est pas un enfant direct debook
, mais quelque part plus profond et on ne sait pas où exactement?//book[/title/@lang = 'it']
ne semble pas fonctionner?Des années plus tard, mais une option utile serait d'utiliser les axes XPath ( https://www.w3schools.com/xml/xpath_axes.asp ). Plus précisément, vous cherchez à utiliser les axes descendants .
Je pense que cet exemple ferait l'affaire:
Cela vous permet de sélectionner tous les
book
éléments qui contiennent untitle
élément enfant (quelle que soit sa profondeur d'imbrication) contenant une valeur d'attribut de langue égale à «it».Je ne peux pas dire avec certitude si cette réponse est pertinente ou non pour l'année 2009 car je ne suis pas sûr à 100% que les axes XPath existaient à ce moment-là. Ce que je peux confirmer, c'est qu'ils existent aujourd'hui et je les ai trouvés extrêmement utiles dans la navigation XPath et je suis sûr que vous le ferez également.
la source
est en fait équivalent à
Je l'ai essayé en utilisant vtd-xml, les deux expressions génèrent le même résultat ... quel moteur de traitement xpath avez-vous utilisé? Je suppose qu'il y a un problème de conformité Ci-dessous le code
la source
Je pense que votre propre suggestion est correcte, mais le XML n'est pas tout à fait valide. Si vous exécutez le
//book[title[@lang='it']]
on,<root>[Your"XML"Here]</root>
les testeurs xPath en ligne gratuits comme celui- ci trouveront le résultat attendu.la source
Essayez d'utiliser cette expression xPath:
Cela devrait vous donner tous les nœuds de livre dans "it" lang
la source