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)