在循环中使用XPath表达式

时间:2015-04-01 09:27:29

标签: java xml loops xpath

我正在使用以下XPath表达式来遍历XML文档:

/templatedatabase/datatypes/integers/integer[index]/@defaultvalue

方法标题:

private static String getGetDefaultValueByIndex(Document doc, XPath xpath, int index) 

“index”是方法中的参数。问题如下: 如果我在方法头中将数字作为参数放置,则查询不会返回值。(例如getGetDefaultValueByIndex(doc, xpath, 1))。

但是,如果我,例如在查询中放置一个像1,2,...代替索引的数字,我在执行相同的方法时从XML文件中获取我想要的数据。 XPath查询是正确的,如果我在查询中手动输入数字,该方法正常工作:

/templatedatabase/datatypes/integers/integer[1]/@defaultvalue

- >这会返回一个值。

然而:

getGetDefaultValueByIndex(doc, xpath, 1)
/templatedatabase/datatypes/integers/integer[index]/@defaultvalue

- >这不会返回值。

我真的不明白为什么这不起作用。我无法想象您无法使用变量循环访问XPath查询。

方法的完整代码:

private static String getGetDefaultValueByIndex(Document doc, XPath xpath, int index) {
         String DefaultValue = null;
         try {
                String expression = "/templatedatabase/datatypes/integers/integer" + "[index]" + "/@defaultvalue";
                DefaultValue = (String) xPath.evaluate(expression, doc, XPathConstants.STRING);     
                System.out.println(DefaultValue);
     } catch(XPathExpressionException e) {
         e.printStackTrace();
     }
         return DefaultValue;
     }

}

1 个答案:

答案 0 :(得分:0)

你的报价错误,请尝试:

String expression = "/templatedatabase/datatypes/integers/integer[" + index + "]/@defaultvalue";

这将包含index参数的到XPath表达式中,而不是文字字符串"index"

尽管有一个警告 - 使用字符串连接动态构建XPath表达式在处理index之类的数值变量时很好,但是如果要提供任意用户指定的字符串表达式的参数使用静态XPath表达式更安全,包括XPath变量,如

"/templatedatabase/datatypes[@name=$targetName]"

并定义XPathVariableResolver以注入实际值。