Xpath,Java和变量
这是我目前的代码:
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);
你的问题不是很清楚,但我认为你想要做的是搜索一些东西,但不是硬编码这个变量名?
String variable = "variable name"; Document document2 = builder.parse(new FileInputStream("C:path to xml file.xml")); Node theNode2 = (Node) xpath.evaluate("//*[@name='" + variable+"']", document2, XPathConstants.NODE);
您需要创建XPathVariableResolver
的实例并将其附加到XPath
实例。 遗憾的是,默认情况下没有提供此接口的标准实现,但它只包含一个方法,因此很容易实现自己:
final Map variables = new HashMap(); XPathVariableResolver varResolver = new XPathVariableResolver() { public Object resolveVariable(QName name) { // for simplicity, ignore namespaces return variables.get(name.getLocalPart()); } }; xpath.setXPathVariableResolver(varResolver);
有了这个,您现在可以使用$var
语法创建变量绑定并在XPath中引用它们:
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);
- com.datastax.driver.core.exceptions.InvalidQueryException:unconfigured table schema_keyspaces
- 两个整数(或多头)没有溢出的平均值,截断为0
- Java Swing:使用相应的键盘按钮时显示按下的按钮
- 如何创建一个可以存储多个对象的arraylist类?
- 如何解除内部关闭请求?
- 从原始文件中获取一些x字节的AudioInputStream(剪切音频文件)
- Spring JPA(Hibernate)没有类型的限定bean:javax.persistence.EntityManagerFactory
- 如何在Java中绘制一个实心圆?
- 带有类类型的JavareflectiongetDeclaredMethod()