Xpath、Java 和变量

2024-04-25

这是我目前拥有的代码:

Document document2 = builder.parse(new FileInputStream("C:path to xml file.xml"));
Node theNode2 = (Node) xpath.evaluate("//*[@name='**variable here**']", document2, XPathConstants.NODE);

如果代码显示“此处为变量”,是否可以使用变量搜索 XML 文件?到目前为止,我只能对我正在搜索的内容进行硬编码,即:

("//*[@name='happy']", document2, XPathConstants.NODE);

您需要创建一个实例XPathVariableResolver http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPathVariableResolver.html并将其附加到您的XPath实例。不幸的是,默认情况下没有提供此接口的标准实现,但它只包含一种方法,因此您自己实现很容易:

final Map<String, Object> variables = new HashMap<String, Object>();
XPathVariableResolver varResolver = new XPathVariableResolver() {
  public Object resolveVariable(QName name) {
    // for simplicity, ignore namespaces
    return variables.get(name.getLocalPart());
  }
};
xpath.setXPathVariableResolver(varResolver);

完成此操作后,您现在可以创建变量绑定并使用 XPath 在 XPath 中引用它们$var syntax:

variables.put("theName", "happy");
Node theNode2 = (Node) xpath.evaluate("//*[@name=$theName]", document2, XPathConstants.NODE);

这比尝试通过将不同的字符串连接在一起来构建 XPath 表达式要安全得多,特别是如果您想要使用的值theName来自不受信任的来源(这相当于 SQL 注入漏洞的 XPath)。

对于 XPath 来说,还有一个额外的复杂性,即虽然您可以使用单引号或双引号来分隔字符串文字,但没有转义机制,因此在 XPath 中不可能有一个同时包含单引号和双引号字符的字符串文字(您必须使用类似的解决方法concat('"', "'"))。变量解析器方法可以毫无问题地处理这种情况:

variables.put("theName", "John \"The Boss\" O'Brien"); // escape " from Java
Node theNode2 = (Node) xpath.evaluate("//*[@name=$theName]", document2, XPathConstants.NODE);

此外,现在实际的 XPath 表达式是一个常量,您可以编译一次,然后根据需要针对不同的变量值执行多次,而不是每次都重新编译:

XPathExpression expr = xpath.compile("//*[@name=$theName]");
// look for @name='name 1'
variables.put("theName", "name 1");
Node node1 = expr.evaluate(document2, XPathConstants.NODE);
// look for @name='name 2' in the same document
variables.put("theName", "name 2");
Node node2 = expr.evaluate(document2, XPathConstants.NODE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xpath、Java 和变量 的相关文章

随机推荐