xpath
Elemente suchen, die bestimmten Text enthalten
Suche…
Finde alle Elemente mit bestimmtem Text
Stellen Sie sich folgendes XML vor:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
Der folgende XPath-Ausdruck:
//*[text() = 'hello']
gibt das <element>hello</element>
, nicht jedoch das Element <another>
. Dies liegt daran, dass das Element <another>
Leerzeichen um den hello
Text enthält.
Um sowohl <element>
als auch <another>
abzurufen, könnte man Folgendes verwenden:
//*[normalize-space(text()) = 'hello']
oder
//*[normalize-space() = 'hello']
Dadurch wird der umgebende Leerraum getrimmt, bevor der Vergleich durchgeführt wird. Hier können wir sehen, dass der Node-Bezeichner text()
bei Verwendung von normalize-space
optional normalize-space
.
Um ein Element zu finden, das bestimmten Text enthält, können Sie die Funktion contains
verwenden. Der folgende Ausdruck gibt das <example>
-Element zurück:
//example[contains(text(), 'Hello')]
Wenn Sie Text suchen möchten, der sich über mehrere untergeordnete / Textknoten erstreckt, können Sie verwenden .
anstelle von text()
. .
bezieht sich auf den gesamten Textinhalt des Elements und seiner untergeordneten Elemente.
//example[. = 'Hello, I am an example .']
Um die mehreren Textknoten anzuzeigen, können Sie Folgendes verwenden:
//example//text()
was wird zurückkehren:
- "Hallo, "
- "Ich bin ein Beispiel"
- "."
Und um den gesamten Textinhalt eines Elements klarer zu sehen, kann man die string
Funktion verwenden:
string(//example[1])
oder nur
string(//example)
Hallo, ich bin ein Beispiel.
Letzteres funktioniert, da XPath 1.0 bei der Übergabe eines Knotensatzes an Funktionen wie string
nur den ersten Knoten (in Dokumentreihenfolge) in diesem Knotensatz betrachtet und den Rest ignoriert.
so:
string(/root/*)
würden zurückkehren:
Hallo