Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将编译后的Java XPath表达式参数化为PreparedStatement样式的语义?_Java_Xpath_Parameterization - Fatal编程技术网

是否可以将编译后的Java XPath表达式参数化为PreparedStatement样式的语义?

是否可以将编译后的Java XPath表达式参数化为PreparedStatement样式的语义?,java,xpath,parameterization,Java,Xpath,Parameterization,是否可以使用股票JAX-p xpath表达式引擎或其他兼容引擎编译允许参数化的xpath表达式 我想看看是否有一个API允许开发人员在编译的xpath中设置占位符,并在运行时替换这些值 任何关于这是否可能以及是否存在警告、陷阱或只是简单的“不要那样做”类型建议的见解都将不胜感激 (注意,我纠正了一个“交叉流”…正在与一位同事就xpath和正则表达式进行对话…只是碰巧在心理上结结巴巴…很抱歉混淆)AFAIK,不是。我不久前研究过这个问题,最后使用了String.format() 但是,这样您就无法

是否可以使用股票JAX-p xpath表达式引擎或其他兼容引擎编译允许参数化的xpath表达式

我想看看是否有一个API允许开发人员在编译的xpath中设置占位符,并在运行时替换这些值

任何关于这是否可能以及是否存在警告、陷阱或只是简单的“不要那样做”类型建议的见解都将不胜感激


(注意,我纠正了一个“交叉流”…正在与一位同事就xpath和正则表达式进行对话…只是碰巧在心理上结结巴巴…很抱歉混淆)

AFAIK,不是。我不久前研究过这个问题,最后使用了
String.format()

但是,这样您就无法将其作为参数化xpath表达式编译一次,而这正是我认为您想要的(也是我想要的)。

我不太确定“正则表达式”是否适合您的问题

JAXP API允许XPath表达式包含变量(例如
//emp[ssn=$e]
),变量的值在运行时通过调用作为API一部分提供的VariableResolver获得。JAXP规范对于什么样的值是可接受的是相当松散的,这在不同的实现中可能有所不同


Saxon XPath API(s9api)更进一步,允许您在编译表达式时显式声明变量及其类型,然后为变量(任何XPath 2.0类型)提供值执行表达式时。

下面是
javax.xml.xpath.XPathVariableResolver的一个非常简单的实现

import java.util.HashMap;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.xpath.XPathVariableResolver;

public class SimpleVariableResolver implements XPathVariableResolver {

    private static final Map<QName, Object> vars = 
        new HashMap<QName, Object>();

    public void addVariable(QName name, Object value) {
        vars.put(name, value);
    }

    public Object resolveVariable(QName name) {
        return vars.get(name);
    }

}

是的,这正是我想要的。。。哦,好吧。@Michael-很抱歉搞混了,我已经更正了我的问题,删除了上面的“常规”。另外,你能提供一个小样本的代码和你的答案,或者一个链接到一个页面来演示这一点吗?我要去看看API来检查它。哇!谢谢你的回答。我完全忽略了这个API,感谢大家指出这一点!也谢谢你发布这个!在阅读了API之后,我几乎以同样的方式实现了这一点。我喜欢@everton agner的答案,并对它投了赞成票。这个答案展示了一个优秀的代码示例,但我认为其中的微妙之处是1)
xpath.compile
必须在
xpath.setXPathVariableResolver
之后为每个变量替换调用,2)
XPathVariableResolver
提到每个实例返回的值必须是不变的。所以对于OP的问题,我不认为这等同于SQL
PreparedStatement
类型绑定。
public static void main(String[] args) throws ParserConfigurationException,
        SAXException, IOException, XPathExpressionException {

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("workbook.xml");

    XPath xpath = XPathFactory.newInstance().newXPath();
    SimpleVariableResolver resolver = new SimpleVariableResolver();
    resolver.addVariable(new QName(null, "id"), 2);
    xpath.setXPathVariableResolver(resolver);
    XPathExpression expr = xpath.compile("/root/element[@id=$id]");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);

    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getTextContent());
    }
}
<root>
    <element id="1">one</element>
    <element id="2">two</element>
    <element id="3">three</element>
</root>
two