XPath OR-Operator für verschiedene Knoten


144

Wie kann ich mit XPath umgehen:

//bookstore/book/title or //bookstore/city/zipcode/title

Funktioniert einfach //titlenicht, weil ich es auch habe//bookstore/magazine/title

ps Ich habe viele oder Beispiele gesehen, aber hauptsächlich mit Attributen oder Einzelknotenstruktur.


5
ODER schließt beide Seiten ein. Was Sie suchen, ist der XOR-Operator. Sie verbinden die englische Verwendung des Wortes OR mit logischen Operatoren.
Zoran Pavlovic

10
In diesem Fall spielt es keine Rolle, ob Sie oder oder xor verwenden, da nicht beide Seiten übereinstimmen können.
Dan Hulme

Antworten:


219

Alle titleKnoten mit zipcodeoder bookKnoten als übergeordnetem Knoten:

Version 1:

//title[parent::zipcode|parent::book]

Version 2:

//bookstore/book/title|//bookstore/city/zipcode/title

5
"|" ist in XPath nicht wirklich ein "ODER-Operator". Es ermöglicht Ihnen, einen Knotensatz zu erstellen, der aus Teilbäumen eines gesamten XML-Baums besteht. "// book | // cd" bedeutet, dass unter allen untergeordneten Knoten und Nachkommen des Stammknotens alle mit dem Namen "book" gefunden werden und dann auch alle mit dem Namen "cd" gefunden werden. Wenn im Abstieg des Stammknotens nur Buchknoten vorhanden sind, enthält Ihr Knotensatz nur Buchknoten. Wenn im Abstieg des Wurzelknotens nur CD-Knoten vorhanden sind, enthält Ihr Knotensatz nur CD-Knoten. Wenn sich in der Abstammung des Stammknotens sowohl Buch- als auch CD-Knoten befinden, enthält Ihr Knotensatz sowohl Buch- als auch CD-Knoten.
Stephan

1
Ja, ich habe verstanden, was "|" Betreiber ist. Meine erste Frage betrifft den OP-Operator. Wenn es also Bücher und CDs gibt, werden nur Bücher gefunden. Wenn es keine Bücher gibt, sondern nur CDs, werden CDs gefunden.
user569008

19
@ user569008: |ist der Union Set-Operator .

1
Es gibt also keine Antwort auf meine Frage / keinen ODER-Operator in XPath für Knoten?
user569008

3
Logische Operatoren (OR, XOR, AND) sind in jeder Programmiersprache gleich, werden jedoch in der natürlichen Sprache leicht unterschiedlich interpretiert. Es ist am besten, Unklarheiten zu beseitigen, wenn Sie Probleme im Zusammenhang damit besprechen. Darüber hinaus mit XPath ist es am besten nicht von Ihrem Ergebnis zu denken , als sein mit a oder b , sondern vielmehr , dass es durch gefunden werden kann a oder b . Logisch orbedeutet, dass es von gefunden werden könnte a or b or both. Logisch xor(eXclusive OR) bedeutet, dass es von gefunden werden kann either a or b, but not both. Logisch andbedeutet, dass es von gefunden werden könnte both a and b.
neXus

52

Wenn Sie nur einen von zwei Knoten mit Union Operator auswählen möchten, können Sie diese Lösung verwenden: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


wirklich das (und )[1]bedeutet, nur eines der beiden auszuwählen?!?!
Oldboy

@Anthony Ja, es wird einer der beiden ausgewählt, wenn beide Knoten vorhanden sind, oder es wird der einzige vorhandene Knoten ausgewählt.
Azurkin

Okay, ich habe deine Aussage falsch interpretiert. Es funktioniert wie jeder andere "oder" Operator. Wenn also die erste Bedingung true zurückgibt, wird die zweite umgangen, ja?
Oldboy

@Anthony Nein. Hier gibt es keine Bedingungen. Es gibt Knoten. Und "|" - ist ein Knotenvereinigungsoperator. Es erstellt einen Knotensatz aus angegebenen Pfaden und garantiert keine Knotenreihenfolge. Wenn ein Knoten mit dem angegebenen Pfad nicht vorhanden ist, fehlt er einfach in einem Knotensatz. Dann erhält das Konstrukt "[1]" den ersten Knoten aus einem Knotensatz.
Azurkin

Mein Punkt ist, dass es ähnlich wie ein oroder in anderen Sprachen ein |Operator funktioniert , so dass, wenn beide Knoten existieren, es immer den ersten Knoten zurückgeben würde?
Oldboy

3

Es hat das Element zwei xpath. Dann können Sie zwei xpaths wie folgt schreiben:

xpath1 | xpath2

Z.B:

//input[@name="username"] | //input[@id="wm_login-username"]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.