Supposons que je possède le code XML suivant:
Purgatorio Dante Alighieri 1308 30.00 Inferno Dante Alighieri 1308 30.00 Harry Potter J K. Rowling 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Learning XML Erik T. Ray 2003 39.95
Je voudrais faire un xpath qui récupère tous les nœuds de livre qui ont un nœud de titre avec un atsortingbut de langue “it”.
Ma tentative ressemblait à ceci:
//book[title[@lang='it']]
Mais ça n’a pas marché. Je compte récupérer les nœuds:
Purgatorio Dante Alighieri 1308 30.00 Inferno Dante Alighieri 1308 30.00
Des indices? Merci d’avance.
Essayer
//book[title/@lang = 'it']
Cela se lit comme suit:
book
title
lang
"it"
Vous trouverez peut-être cela utile – c’est un article intitulé “XPath in Five Paragraphs” 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 n’ait des “problèmes”. Donc, ce que vous ne nous montrez pas dans le code ou l’échantillon XML – par exemple, votre échantillon est un fragment XML. Se pourrait-il que l’élément racine ait un espace de nom, et vous ne comptez pas pour cela dans votre requête? Et vous nous avez seulement dit que cela ne fonctionnait pas, mais vous ne nous avez pas dit quels résultats vous aviez obtenus.
Des années plus tard, 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 des descendants .
Je crois que cet exemple ferait l’affaire:
//book[descendant::title[@lang='it']]
Cela vous permet de sélectionner tous les éléments de book
contenant un élément de title
enfant (quelle que soit sa profondeur), contenant une valeur d’atsortingbut de langue égale à «it».
Je ne peux pas dire avec certitude si cette réponse est pertinente pour l’année 2009 car je ne suis pas certain à 100% que les axes XPath existaient à cette époque. Ce que je peux confirmer, c’est qu’elles existent aujourd’hui et je les ai trouvées extrêmement utiles dans la navigation XPath et je suis sûr que vous le ferez également.
//book[title[@lang='it']]
est en fait équivalent à
//book[title/@lang = 'it']
Je l’ai essayé en utilisant vtd-xml, les deux expressions ont craché le même résultat … quel moteur de traitement xpath avez-vous utilisé? Je suppose qu’il a un problème de conformité Ci-dessous le code
import com.ximpleware.*; public class test1 { public static void main(Ssortingng[] s) throws Exception{ VTDGen vg = new VTDGen(); if (vg.parseFile("c:/books.xml", true)){ VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); ap.selectXPath("//book[title[@lang='it']]"); //ap.selectXPath("//book[title/@lang='it']"); int i; while((i=ap.evalXPath())!=-1){ System.out.println("index ==>"+i); } /*if (vn.endsWith(i, "< test")){ System.out.println(" good "); }else System.out.println(" bad ");*/ } } }
Je pense que votre propre suggestion est correcte, cependant le xml n’est pas tout à fait valide. Si vous exécutez le //book[title[@lang='it']]
sur
les testeurs xPath en ligne gratuits comme celui- ci trouveront le résultat attendu.
Essayez d’utiliser cette expression xPath:
//book/title[@lang='it']/..
Cela devrait vous donner tous les nœuds de livres dans “it” lang