XPath: Textknoten auswählen

150

Mit folgendem XML:

<node>Text1<subnode/>text2</node>

Wie wähle ich über XPath entweder den ersten oder den zweiten Textknoten aus?

Etwas wie das:

/node/text()[2]

funktioniert natürlich nicht, weil es das zusammengeführte Ergebnis jedes Textes innerhalb des Knotens ist.

Kernel
quelle
11
Sie haben geschrieben: /node/text()[2][...] funktioniert nicht, weil es das zusammengeführte Ergebnis jedes Textes innerhalb des Knotens ist. Das ist falsch: Es bedeutet, dass das zweite untergeordnete Textknoten des nodeStammelements . Der Zeichenfolgenwert (Verkettung von string(/node)
Sie meinen, dass die Xpath-Abfrage funktionieren sollte? Nun, ich glaube, ich habe dann woanders ein anderes Problem. ;) Vielen Dank!
Kernel
Gute Frage, +1. In meiner Antwort finden Sie Erklärungen und einige XPath-Ausdrücke, die entweder alle oder ein bestimmtes untergeordnetes Textknotenelement des obersten Elements auswählen.
Dimitre Novatchev

Antworten:

183

Mit folgendem XML:

<node>Text1<subnode/>text2</node> 

Wie wähle ich über XPath entweder den ersten oder den zweiten Textknoten aus?

Verwendung :

/node/text()

Dadurch werden alle untergeordneten Textknoten des obersten Elements (mit dem Namen "Knoten") des XML-Dokuments ausgewählt.

/node/text()[1]

Dadurch wird das erste untergeordnete Textknoten des obersten Elements (mit dem Namen "Knoten") des XML-Dokuments ausgewählt.

/node/text()[2]

Dadurch wird das zweite untergeordnete Textknoten des obersten Elements (mit dem Namen "Knoten") des XML-Dokuments ausgewählt.

/node/text()[someInteger]

Dadurch wird das untergeordnete Textknoten-Kind des obersten Elements (mit dem Namen "Knoten") des XML-Dokuments ausgewählt. Es entspricht dem folgenden XPath-Ausdruck:

/node/text()[position() = someInteger]
Dimitre Novatchev
quelle
@NaftuliTzviKay: Dies bedeutet, dass Chrome defekt ist. /node[2]darf keinen Knoten auswählen, wenn das XML-Quelldokument wohlgeformt ist. Per Definition gibt es in einem wohlgeformten XML-Dokument nur ein (einzelnes) oberstes Element - auch bekannt alsdocument-element
Dimitre Novatchev
1
Funktioniert das in PHP? Ich versuche, nur Textknoten zu durchlaufen, auch solche zwischen einer Reihe von Tags. Das Problem ist, dass der Inhalt mehrerer Textknoten unabhängig von Tags zusammengeschlagen wird. Trotzdem //*[text()]benutzen. /html/text()funktioniert nicht.
Aaron Gillion
2
@AaronGillion, Ja, AFAIK PHP hat eine korrekt funktionierende XPath 1.0-Evaluierung. Beachten Sie, dass /html/text()nicht alle Textknoten im Dokument ausgewählt werden - nur die Textknoten, die untergeordnete htmlElemente (keine Nachkommen) des obersten Elements sind. Sie wollen wahrscheinlich /html//text() . Einige Kenntnisse und Kenntnisse in XPath sind normalerweise erforderlich, um XPath-Ausdrücke zu erstellen.
Dimitre Novatchev
Vielen Dank. Ich habe den Double-Slash-Trick vor einiger Zeit herausgefunden!
Aaron Gillion
@ AaronGillion, Gern geschehen. Sie können die Grundlagen von XPath 1.0 und 2.0 in Modul 2 dieses Online-Trainingskurses erlernen
Dimitre Novatchev
29

Ihr xpath sollte funktionieren. Ich habe Ihren und meinen xpath sowohl in der MarkLogic- als auch in der Zorba Xquery / Xpath-Implementierung getestet.

Beides sollte funktionieren.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
Kadalamittai
quelle