Supongamos que tengo el siguiente 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>
Me gustaría hacer un xpath que recupere todos los nodos de libros que tienen un nodo de título con un atributo de idioma de "eso".
Mi intento se parecía a esto:
//book[title[@lang='it']]
Pero eso no funcionó. Espero recuperar los nodos:
<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>
¿Alguna pista?
Respuestas:
Tratar
Esto dice:
book
elementostitle
lang
"it"
Usted puede encontrar este útil - es un artículo titulado "XPath en cinco párrafos" por Ronald Bourret.
Pero con toda honestidad,
//book[title[@lang='it']]
y lo anterior debería ser equivalente, a menos que su motor XPath tenga "problemas". Por lo tanto, podría ser algo en el código o XML de muestra que no nos está mostrando; por ejemplo, su muestra es un fragmento XML. ¿Podría ser que el elemento raíz tiene un espacio de nombres y no lo está contando en su consulta? Y solo nos dijo que no funcionó, pero no nos dijo qué resultados obtuvo.fuente
title
no es hijo directo debook
, sino en algún lugar más profundo y no sabemos dónde exactamente?//book[/title/@lang = 'it']
no parece funcionar?Años más tarde, pero una opción útil sería utilizar XPath Axes ( https://www.w3schools.com/xml/xpath_axes.asp ). Más específicamente, está buscando usar los descendientes ejes .
Creo que este ejemplo haría el truco:
Esto le permite seleccionar todos los
book
elementos que contienen un niño.title
elemento (independientemente de qué tan profundo esté anidado) que contengan un valor de atributo de idioma igual a 'eso'.No puedo decir con certeza si esta respuesta es relevante para el año 2009, ya que no estoy 100% seguro de que XPath Axes existiera en ese momento. Lo que puedo confirmar es que existen hoy y los he encontrado extremadamente útiles en la navegación XPath y estoy seguro de que usted también lo hará.
fuente
es realmente equivalente a
Lo probé usando vtd-xml, ambas expresiones arrojan el mismo resultado ... ¿qué motor de procesamiento xpath usaste? Supongo que tiene un problema de conformidad A continuación se muestra el código
fuente
Creo que su propia sugerencia es correcta, sin embargo, el xml no es del todo válido. Si está ejecutando la
//book[title[@lang='it']]
de<root>[Your"XML"Here]</root>
entonces los probadores libres XPath en línea, tales como uno que aquí se encuentra el resultado esperado.fuente
Intente usar esta expresión xPath:
Eso debería proporcionarle todos los nodos de libros en el idioma "it"
fuente