Angenommen, ich habe das folgende XML:
<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>
Ich möchte einen xpath erstellen, der alle Buchknoten zurückgibt, die einen Titelknoten mit dem Sprachattribut "it" haben.
Mein Versuch sah ungefähr so aus:
//book[title[@lang='it']]
Aber das hat nicht funktioniert. Ich erwarte, die Knoten zurückzubekommen:
<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>
Irgendwelche Hinweise?
Antworten:
Versuchen
Dies lautet:
book
Elementetitle
lang
"it"
Vielleicht finden Sie dies hilfreich - es ist ein Artikel mit dem Titel "XPath in Five Paragraphs" von Ronald Bourret.
Aber ganz ehrlich,
//book[title[@lang='it']]
und das oben Genannte sollte gleichwertig sein, es sei denn, Ihre XPath-Engine hat "Probleme". Es könnte sich also um etwas im Code oder im Beispiel-XML handeln, das Sie uns nicht anzeigen. Beispielsweise ist Ihr Beispiel ein XML-Fragment. Könnte es sein, dass das Stammelement einen Namespace hat und Sie dies in Ihrer Abfrage nicht berücksichtigen? Und Sie haben uns nur gesagt, dass es nicht funktioniert hat, aber Sie haben uns nicht gesagt, welche Ergebnisse Sie erzielt haben.quelle
title
man kein direktes Kind istbook
, sondern irgendwo tiefer und wir nicht genau wissen, wo?//book[/title/@lang = 'it']
scheint nicht zu funktionieren?Jahre später wäre es jedoch eine nützliche Option, XPath-Achsen zu verwenden ( https://www.w3schools.com/xml/xpath_axes.asp) ). Insbesondere möchten Sie die Nachkommen verwenden Achsen .
Ich glaube, dieses Beispiel würde den Trick machen:
Auf diese Weise können Sie alle auswählen
book
Elemente , die ein Element enthaltentitle
Element enthalten (unabhängig davon, wie tief es verschachtelt ist), dessen Sprachattributwert gleich 'it' ist.Ich kann nicht sicher sagen, ob diese Antwort für das Jahr 2009 relevant ist oder nicht, da ich nicht 100% sicher bin, dass die XPath-Achsen zu diesem Zeitpunkt existierten. Was ich bestätigen kann, ist, dass sie heute existieren und ich habe festgestellt, dass sie in der XPath-Navigation äußerst nützlich sind, und ich bin sicher, dass Sie dies auch tun werden.
quelle
ist eigentlich gleichbedeutend mit
Ich habe es mit vtd-xml versucht. Beide Ausdrücke haben das gleiche Ergebnis erzielt. Welche xpath-Verarbeitungs-Engine haben Sie verwendet? Ich denke, es hat ein Konformitätsproblem. Unten ist der Code
quelle
Ich würde denken, Ihr eigener Vorschlag ist richtig, aber die XML ist nicht ganz gültig. Wenn Sie das
//book[title[@lang='it']]
on<root>[Your"XML"Here]</root>
ausführen, finden die kostenlosen Online-xPath-Tester wie hier das erwartete Ergebnis.quelle
Versuchen Sie, diesen xPath-Ausdruck zu verwenden:
Das sollte Ihnen alle Buchknoten in "it" lang geben
quelle