Suponha que eu tenha o seguinte XML:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
Eu gostaria de fazer um xpath que recupere todos os nós do livro que têm um nó de título com um atributo de idioma de "isso".
Minha tentativa foi mais ou menos assim:
//book[title[@lang='it']]
Mas isso não funcionou. Espero recuperar os nós:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
Alguma dica?
Respostas:
Experimentar
Isso diz:
book
elementostitle
lang
"it"
Você pode achar isso útil - é um artigo intitulado "XPath em cinco parágrafos", de Ronald Bourret.
Mas com toda a honestidade,
//book[title[@lang='it']]
e o acima deve ser equivalente, a menos que seu mecanismo XPath tenha "problemas". Portanto, pode ser algo no código ou amostra XML que você não está nos mostrando - por exemplo, sua amostra é um fragmento XML. Será que o elemento raiz tem um namespace, e você não está contando para isso em sua consulta? E você apenas nos disse que não funcionou, mas não nos disse quais resultados obteve.fonte
title
não é filho direto debook
, mas em algum lugar mais profundo e não sabemos exatamente onde?//book[/title/@lang = 'it']
não parece funcionar?Anos depois, mas uma opção útil seria utilizar os eixos XPath ( https://www.w3schools.com/xml/xpath_axes.asp ). Mais especificamente, você está procurando usar os eixos descendentes .
Acredito que este exemplo resolveria o problema:
Isso permite que você selecione todos os
book
elementos que contêm umtitle
elemento filho (independentemente de quão profundo ele está aninhado) contendo o valor do atributo de idioma igual a 'it'.Não posso dizer com certeza se esta resposta é ou não relevante para o ano de 2009, pois não estou 100% certo de que os eixos XPath existiam naquela época. O que posso confirmar é que eles existem hoje e os considero extremamente úteis na navegação XPath e tenho certeza de que você também o fará.
fonte
é realmente equivalente a
Eu tentei usando vtd-xml, ambas as expressões produziram o mesmo resultado ... qual mecanismo de processamento xpath você usou? Acho que tem problema de conformidade. Abaixo está o código
fonte
Eu acho que sua sugestão está correta, porém o xml não é muito válido. Se você estiver executando o
//book[title[@lang='it']]
on<root>[Your"XML"Here]</root>
, os testadores xPath online gratuitos, como este aqui , encontrarão o resultado esperado.fonte
Tente usar esta expressão xPath:
Isso deve dar a você todos os nós do livro na linguagem "it"
fonte