Java:Xpath计算中的Xpath变量
我想在xml文件中获取节点的节点:Java:Xpath计算中的Xpath变量,java,xml,xpath,Java,Xml,Xpath,我想在xml文件中获取节点的节点: public Map<String, String> getAllClassesDetails() throws XPathExpressionException { Map<String, String> data = new HashMap<>(); XPath xpath = XPathFactory.newInstance().newXPath(); NodeList
public Map<String, String> getAllClassesDetails() throws XPathExpressionException {
Map<String, String> data = new HashMap<>();
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodesClasses = (NodeList) xpath.evaluate("/Plan/featureMember/node()", document, XPathConstants.NODESET);
for (int i = 0; i < nodesClasses.getLength(); i++) {
// System.out.println(nodesClasses.item(i).getNodeName());
String rawXPath = String.format("/Plan/featureMember/%s/node()", nodesClasses.item(i).getNodeName());
NodeList nodesDetails = (NodeList) xpath.evaluate(rawXPath, document, XPathConstants.NODESET);
for (int j = 0; j < nodesDetails.item(i).getChildNodes().getLength(); j++) {
data.put(nodesClasses.item(i).getNodeName(), nodesDetails.item(j).getNodeName());
}
}
return data;
<?xml version="1.0" encoding="UTF-8"?>
<Plan>
<featureMember>
<TestA>
<Objet></Objet>
<nature>03</nature>
<mastery>5</mastery>
</TestA>
<TestB>
<Objet></Objet>
<nature>03</nature>
<mastery>5</mastery>
</TestB>
<TestC>
<Objet></Objet>
<nature>03</nature>
<mastery>5</mastery>
</TestC>
</featureMember>
</Plan>
如何在xpath.evaluate中指定变量
编辑:这里是我的xml文件:
public Map<String, String> getAllClassesDetails() throws XPathExpressionException {
Map<String, String> data = new HashMap<>();
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodesClasses = (NodeList) xpath.evaluate("/Plan/featureMember/node()", document, XPathConstants.NODESET);
for (int i = 0; i < nodesClasses.getLength(); i++) {
// System.out.println(nodesClasses.item(i).getNodeName());
String rawXPath = String.format("/Plan/featureMember/%s/node()", nodesClasses.item(i).getNodeName());
NodeList nodesDetails = (NodeList) xpath.evaluate(rawXPath, document, XPathConstants.NODESET);
for (int j = 0; j < nodesDetails.item(i).getChildNodes().getLength(); j++) {
data.put(nodesClasses.item(i).getNodeName(), nodesDetails.item(j).getNodeName());
}
}
return data;
<?xml version="1.0" encoding="UTF-8"?>
<Plan>
<featureMember>
<TestA>
<Objet></Objet>
<nature>03</nature>
<mastery>5</mastery>
</TestA>
<TestB>
<Objet></Objet>
<nature>03</nature>
<mastery>5</mastery>
</TestB>
<TestC>
<Objet></Objet>
<nature>03</nature>
<mastery>5</mastery>
</TestC>
</featureMember>
</Plan>
03
5.
03
5.
03
5.
我不清楚您为什么会出错,但您使用的方法效率低下。它也有潜在的不安全性——您需要意识到注入攻击的可能性
不要为NodeClass中的每个条目构造和编译新的XPath表达式,而是使用带有变量的通用表达式:
"/Plan/featureMember/*[local-name=$className]/node()"
使用变量解析器将变量绑定到值:
xpath.setXPathVariableResolver(varName -> {
if (varName.getLocalPart().equals("className")) {
return nodesClasses.item(i).getNodeName();
} else {
return "";
}
}
如果没有看到输入XML的示例以及您希望在
映射中看到的结果,我不确定“节点的节点”是什么意思。你能回答这个问题来提供这些信息吗?(当前,如果您有一个没有子节点的节点,代码看起来会抛出NullPointerException
——但我无法重新创建您的TransformerException
错误。)@andrewjames好的,我刚刚用xml文件编辑了我的帖子谢谢您的xml。但是您希望在地图中看到什么?你想在这里捕捉什么?