xpath
Elementen zoeken die specifieke tekst bevatten
Zoeken…
Zoek alle elementen met bepaalde tekst
Stel je de volgende XML voor:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
De volgende XPath-expressie:
//*[text() = 'hello']
retourneert het <element>hello</element>
, maar niet het element <another>
. Dit komt omdat het element <another>
witruimte rondom de hello
tekst bevat.
Om zowel <element>
als <another>
, zou men kunnen gebruiken:
//*[normalize-space(text()) = 'hello']
of
//*[normalize-space() = 'hello']
waarmee de omringende witruimte wordt bijgesneden voordat de vergelijking wordt uitgevoerd. Hier kunnen we zien dat de specificator text()
node optioneel is bij gebruik van normalize-space
.
Om een element te vinden dat specifieke tekst bevat, kunt u de functie contains
. De volgende expressie retourneert het element <example>
:
//example[contains(text(), 'Hello')]
Als u tekst wilt zoeken die meerdere kinderen / tekstknooppunten omvat, kunt u gebruiken .
in plaats van text()
. .
verwijst naar de volledige tekstinhoud van het element en zijn kinderen.
//example[. = 'Hello, I am an example .']
Om de meerdere tekstknooppunten te zien, kunt u het volgende gebruiken:
//example//text()
die zal terugkeren:
- "Hallo, "
- "Ik ben een voorbeeld"
- ""
En om de volledige tekstinhoud van een element duidelijker te zien, kan men de string
:
string(//example[1])
of gewoon
string(//example)
Hallo, ik ben een voorbeeld.
Het laatste werkt omdat, als een knooppuntset wordt doorgegeven aan functies zoals string
, XPath 1.0 alleen naar het eerste knooppunt (in documentvolgorde) in die knooppuntset kijkt en de rest negeert.
zo:
string(/root/*)
zou terugbrengen:
Hallo