xml xpath axiom xpath-1.0

xml - ¿Cómo pasar el parámetro variable a la expresión XPath?



axiom xpath-1.0 (2)

Dado que está utilizando la biblioteca Axiom XPath, que a su vez usa Jaxen, deberá seguir los siguientes tres pasos para hacerlo de una manera completamente sólida:

  • Cree un SimpleVariableContext y llame a context.setVariableValue("val", "value1") para asignar un valor a esa variable.
  • En su objeto BaseXPath , llame a .setVariableContext() para pasar en el contexto que asignó.
  • Dentro de su expresión, use /a/b/c[x=$val]/y para referirse a ese valor.

Considera lo siguiente:

package com.example; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.impl.common.AxiomText; import org.apache.axiom.om.util.AXIOMUtil; import org.apache.axiom.om.xpath.DocumentNavigator; import org.jaxen.*; import javax.xml.stream.XMLStreamException; public class Main { public static void main(String[] args) throws XMLStreamException, JaxenException { String xmlPayload="<parent><a><b><c><x>val1</x><y>abc</y></c>" + "<c><x>val2</x><y>abcd</y></c>" + "</b></a></parent>"; OMElement xmlOMOBject = AXIOMUtil.stringToOM(xmlPayload); SimpleVariableContext svc = new SimpleVariableContext(); svc.setVariableValue("val", "val2"); String xpartString = "//c[x=$val]/y/text()"; BaseXPath contextpath = new BaseXPath(xpartString, new DocumentNavigator()); contextpath.setVariableContext(svc); AxiomText selectedNode = (AxiomText) contextpath.selectSingleNode(xmlOMOBject); System.out.println(selectedNode.getText()); } }

... que emite como salida:

abcd

Quiero pasar un parámetro a una expresión XPath.

(//a/b/c[x=?],myParamForXAttribute)

¿Puedo hacer esto con XPath 1.0? (Intenté string-join pero no está allí en XPath 1.0)

Entonces, ¿cómo puedo hacer esto?

Mi XML se parece a

<a> <b> <c> <x>val1</x> <y>abc</y> </c> <c> <x>val2</x> <y>abcd</y> </c> </b> </a>

Quiero obtener el valor del elemento <y> donde el valor del elemento x es val1

Intenté //a/b/c[x=''val1'']/y pero no funcionó.


Depende del idioma en el que esté usando XPath.

En XSLT:

"//a/b/c[x=$myParamForXAttribute]"

Tenga en cuenta que, a diferencia del enfoque anterior, los tres siguientes están abiertos a ataques de inyección XPath y nunca deben usarse con entradas no controladas o no confiables; Para evitar esto, utilice un mecanismo proporcionado por su idioma o biblioteca para pasar variables fuera de banda. [ Crédito : Charles Duffy]

Cía#:

String.Format("//a/b/c[x={0}]", myParamForXAttribute);

En Java:

String.format("//a/b/c[x=%s]", myParamForXAttribute);

En Python:

"//a/b/c[x={}]".format(myParamForXAttribute)