xpath
Hitta element som innehåller specifik text
Sök…
Hitta alla element med viss text
Föreställ dig följande XML:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
Följande XPath-uttryck:
//*[text() = 'hello']
kommer att returnera <element>hello</element>
-elementet, men inte <another>
-elementet. Detta beror på att <another>
-elementet innehåller ett utrymme som omger hello
.
För att hämta både <element>
och <another>
, kan man använda:
//*[normalize-space(text()) = 'hello']
eller
//*[normalize-space() = 'hello']
vilket kommer att trimma det omgivande vitrummet innan du gör jämförelsen. Här kan vi se att text()
nodspecifikationen är valfri när du använder normalize-space
.
För att hitta ett element som innehåller specifik text kan du använda funktionen contains
. Följande uttryck returnerar elementet <example>
:
//example[contains(text(), 'Hello')]
Om du vill hitta text som spänner över flera barn / textnoder kan du använda .
istället för text()
. .
hänvisar till hela textinnehållet i elementet och det är barn.
//example[. = 'Hello, I am an example .']
För att se flera textnoder kan du använda:
//example//text()
som kommer att återvända:
- "Hallå, "
- "Jag är ett exempel"
- ""
Och för att tydligare se hela textinnehållet i ett element kan man använda string
:
string(//example[1])
eller bara
string(//example)
Hej, jag är ett exempel.
Det senare fungerar eftersom XPath 1.0 bara tittar på den första noden (i dokumentordning) i den noduppsättningen och ignorerar resten om en noduppsättning överförs till funktioner som string
.
så:
string(/root/*)
skulle återvända:
Hej