Você escreveu: /node/text()[2][...] não funciona porque é o resultado mesclado de todo texto dentro do nó. Isso está errado: significa o segundo filho do nó noderaiz do elemento raiz . O valor da sequência (concatenação dos nós de texto descendentes) seria #string(/node)
Você quer dizer que a consulta Xpath deve funcionar? Bem, acho que tenho outro problema em outro lugar. ;) Obrigado!
kernel
Boa pergunta, +1. Consulte minha resposta para obter explicações e várias expressões XPath que selecionam todo ou um filho específico do nó de texto do elemento superior.
Dimitre Novatchev
Respostas:
183
Tendo o seguinte XML:
<node>Text1<subnode/>text2</node>
Como seleciono o primeiro ou o segundo nó de texto via XPath?
Use :
/node/text()
Isso seleciona todos os filhos do nó de texto do elemento superior (chamado "nó") do documento XML.
/node/text()[1]
Isso seleciona o primeiro filho do nó de texto do elemento superior (chamado "nó") do documento XML.
/node/text()[2]
Isso seleciona o segundo filho do nó de texto do elemento superior (chamado "nó") do documento XML.
/node/text()[someInteger]
Isso seleciona o filho do nó superior do elemento superior (chamado "nó") do documento XML. É equivalente à seguinte expressão XPath:
@NaftuliTzviKay: isso significa que o Chrome está quebrado. /node[2]não deve selecionar nenhum nó se o documento XML de origem estiver bem formado. Por definição, em um documento XML bem formado, existe apenas um (único) elemento superior - também conhecido comodocument-element
Dimitre Novatchev
1
Isso funciona em PHP? Estou tentando fazer um loop através de apenas nós de texto, mesmo aqueles entre um conjunto de tags. O problema é que está quebrando o conteúdo de vários nós de texto, independentemente das tags. Usando de //*[text()]qualquer maneira. /html/text()não funciona.
Aaron Gillion
2
@AaronGillion, Sim, o AFAIK PHP tem uma avaliação XPath 1.0 funcionando corretamente. Observe que /html/text()não seleciona todos os nós de texto no documento - apenas os nós de texto filhos (não descendentes) do htmlelemento superior . Você provavelmente quer /html//text() . Geralmente, é necessário algum conhecimento e entendimento do XPath para construir expressões XPath.
Dimitre Novatchev
Obrigado. Eu descobri o truque de barra dupla há pouco!
seu xpath deve funcionar. Testei o seu xpath e o meu na implementação do MarkLogic e do Zorba Xquery / Xpath.
Ambos devem funcionar.
/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
/node/text()[2]
[...] não funciona porque é o resultado mesclado de todo texto dentro do nó. Isso está errado: significa o segundo filho do nónode
raiz do elemento raiz . O valor da sequência (concatenação dos nós de texto descendentes) seria #string(/node)
Respostas:
Use :
Isso seleciona todos os filhos do nó de texto do elemento superior (chamado "nó") do documento XML.
Isso seleciona o primeiro filho do nó de texto do elemento superior (chamado "nó") do documento XML.
Isso seleciona o segundo filho do nó de texto do elemento superior (chamado "nó") do documento XML.
Isso seleciona o filho do nó superior do elemento superior (chamado "nó") do documento XML. É equivalente à seguinte expressão XPath:
fonte
/node[2]
não deve selecionar nenhum nó se o documento XML de origem estiver bem formado. Por definição, em um documento XML bem formado, existe apenas um (único) elemento superior - também conhecido comodocument-element
//*[text()]
qualquer maneira./html/text()
não funciona./html/text()
não seleciona todos os nós de texto no documento - apenas os nós de texto filhos (não descendentes) dohtml
elemento superior . Você provavelmente quer/html//text()
. Geralmente, é necessário algum conhecimento e entendimento do XPath para construir expressões XPath.seu xpath deve funcionar. Testei o seu xpath e o meu na implementação do MarkLogic e do Zorba Xquery / Xpath.
Ambos devem funcionar.
fonte