XPath: selezionare il nodo di testo


150

Avere il seguente XML:

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

Come posso selezionare il primo o il secondo nodo di testo tramite XPath?

Qualcosa come questo:

/node/text()[2]

ovviamente non funziona perché è il risultato unito di ogni testo all'interno del nodo.


11
Hai scritto: /node/text()[2][...] non funziona perché è il risultato unito di ogni testo all'interno del nodo È sbagliato: significa secondo nodo di testo figlio nodedell'elemento radice . Il valore della stringa (concatenazione dei nodi di testo discendente) sarebbestring(/node)

Vuoi dire che la query Xpath dovrebbe funzionare? Beh, immagino di avere un altro problema da qualche altra parte allora. ;) Grazie!
kernel

Buona domanda, +1. Vedi la mia risposta per la spiegazione e diverse espressioni XPath che selezionano tutto o uno specifico figlio del nodo di testo dell'elemento superiore.
Dimitre Novatchev,

Risposte:


183

Avere il seguente XML:

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

Come faccio a selezionare il primo o il secondo nodo di testo tramite XPath?

Utilizzare :

/node/text()

Questo seleziona tutti i figli del nodo di testo dell'elemento superiore (chiamato "nodo") del documento XML.

/node/text()[1]

Questo seleziona il primo figlio del nodo di testo dell'elemento superiore (chiamato "nodo") del documento XML.

/node/text()[2]

Questo seleziona il secondo figlio del nodo di testo dell'elemento superiore (chiamato "nodo") del documento XML.

/node/text()[someInteger]

Questo seleziona il figlio del nodo di testo someInteger-th dell'elemento superiore (chiamato "nodo") del documento XML. È equivalente alla seguente espressione XPath:

/node/text()[position() = someInteger]

@NaftuliTzviKay: questo significa che Chrome non funziona. /node[2]non deve selezionare alcun nodo se il documento XML di origine è ben formato. Per definizione in un documento XML ben formato c'è solo un (singolo) elemento superiore - noto anche comedocument-element
Dimitre Novatchev,

1
Funziona in PHP? Sto cercando di scorrere solo i nodi di testo, anche quelli tra una serie di tag. Il problema è che sta distruggendo il contenuto di più nodi di testo insieme, indipendentemente dai tag. Usando //*[text()]comunque. /html/text()non funziona.
Aaron Gillion,

2
@AaronGillion, Sì, AFAIK PHP ha una valutazione XPath 1.0 correttamente funzionante. Nota che /html/text()non seleziona tutti i nodi di testo nel documento - solo i nodi di testo che sono figli (non discendenti) htmldell'elemento superiore . Probabilmente vuoi /html//text() . Alcune conoscenze e comprensioni di XPath sono in genere necessarie per costruire espressioni XPath.
Dimitre Novatchev,

Grazie. Ho capito il trucco della doppia barra un po 'di tempo fa!
Aaron Gillion,

@AaronGillion, Prego. Puoi apprendere le basi di XPath 1.0 e 2.0 nel modulo 2 di questo corso di formazione online: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

il tuo xpath dovrebbe funzionare. ho testato il tuo xpath e il mio sia in MarkLogic che in Zorba Xquery / Xpath.

Entrambi dovrebbero funzionare.

/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.