uso regulares online herramienta expresiones crear xml xpath

xml - regulares - xpath online



XPath: obtener nodos donde el nodo hijo contiene un atributo (5)

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ás buscando usar los ejes descendientes .

Creo que este ejemplo sería el truco:

//book[descendant::title[@lang=''it'']]

Esto le permite seleccionar todos los elementos del book que contengan un elemento de title secundario (sin importar qué tan profundo esté anidado) que contenga un valor de atributo de idioma igual a ''it''.

No puedo decir con certeza si esta respuesta es relevante para el año 2009 ya que no estoy 100% seguro de que los ejes XPath existieran en ese momento. Lo que puedo confirmar es que sí existen hoy y he encontrado que son extremadamente útiles en la navegación XPath y estoy seguro de que también lo harán.

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 "ello".

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>

¿Algún consejo? Gracias por adelantado.


Creo que tu sugerencia es correcta, sin embargo, el xml no es completamente válido. Si está ejecutando //book[title[@lang=''it'']] en <root>[Your"XML"Here]</root> entonces los probadores de xPath en línea gratuitos como el que se encuentra here encontrarán el resultado esperado.


Intenta usar esta expresión xPath:

//book/title[@lang=''it'']/..

Eso debería darte todos los nodos de libros en "it" lang


Tratar

//book[title/@lang = ''it'']

Esto dice:

  • obtener todos los elementos del book
    • que tienen al menos un title
      • que tiene un atributo lang
        • con un valor de "it"

Puede encontrar útil this : es un artículo titulado this de 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 muestre, por ejemplo, su muestra es un fragmento XML. ¿Podría ser que el elemento raíz tenga un espacio de nombres y no cuente para eso en su consulta? Y solo nos dijiste que no funcionó, pero no nos dijiste qué resultados obtuviste.


//book[title[@lang=''it'']]

es en realidad equivalente a

//book[title/@lang = ''it'']

Lo intenté usando vtd-xml, ambas expresiones arrojaron el mismo resultado ... ¿qué motor de procesamiento xpath usaste? Supongo que tiene un problema de conformidad. A continuación está el código.

import com.ximpleware.*; public class test1 { public static void main(String[] s) throws Exception{ VTDGen vg = new VTDGen(); if (vg.parseFile("c:/books.xml", true)){ VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); ap.selectXPath("//book[title[@lang=''it'']]"); //ap.selectXPath("//book[title/@lang=''it'']"); int i; while((i=ap.evalXPath())!=-1){ System.out.println("index ==>"+i); } /*if (vn.endsWith(i, "< test")){ System.out.println(" good "); }else System.out.println(" bad ");*/ } } }