在循环中使用 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
来注入实际值。
我正在使用以下 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表达式更安全,包括像
"/templatedatabase/datatypes[@name=$targetName]"
并定义一个 XPathVariableResolver
来注入实际值。