在循环中使用 XPath 表达式

Using XPath Expression in Loop

我正在使用以下 XPath 表达式循环访问 XML 文档:

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

方法header:

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

"index"是方法中的一个参数。问题如下: 如果我在方法 header 中输入一个数字作为参数,则查询不会 return 值。(例如 getGetDefaultValueByIndex(doc, xpath, 1))。

但是,例如,如果我在查询中用数字 1,2... 代替索引,我会在执行相同方法的同时从 XML 文件中获取我想要的数据。 XPath 查询是正确的,如果我像这样在查询中手动输入数字,则该方法有效:

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

--> 这 return 是一个值。

但是:

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

--> 这不是 return 值。

我真的不明白为什么这不起作用。我无法想象您不能使用变量循环遍历 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;
     }

}

你把引号放错地方了,试试:

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

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

不过要提醒一句——当你处理像 index 这样的数字变量时,使用字符串连接动态构建 XPath 表达式是好的,但是如果你想提供任意用户指定的 表达式的字符串参数使用静态XPath表达式更安全,包括像

这样的XPath变量
"/templatedatabase/datatypes[@name=$targetName]"

并定义一个 XPathVariableResolver 来注入实际值。