Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
Xpath、Java和变量_Java_Xml_Xpath - Fatal编程技术网

Xpath、Java和变量

Xpath、Java和变量,java,xml,xpath,Java,Xml,Xpath,以下是我目前拥有的代码: Document document2 = builder.parse(new FileInputStream("C:path to xml file.xml")); Node theNode2 = (Node) xpath.evaluate("//*[@name='**variable here**']", document2, XPathConstants.NODE); 如果代码显示“variable here”,是否可以使用变量搜索XML文件?到目前为止,我只能在

以下是我目前拥有的代码:

Document document2 = builder.parse(new FileInputStream("C:path to xml file.xml"));
Node theNode2 = (Node) xpath.evaluate("//*[@name='**variable here**']", document2, XPathConstants.NODE);
如果代码显示“variable here”,是否可以使用变量搜索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);

您需要创建的实例并将其附加到
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表达式要安全得多,特别是如果要用于
theName
的值来自不受信任的源(这是XPath相当于SQL注入漏洞)

对于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);
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);