Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Java:Xpath计算中的Xpath变量_Java_Xml_Xpath - Fatal编程技术网

Java:Xpath计算中的Xpath变量

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

我想在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> 
如何在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。但是您希望在
地图中看到什么?你想在这里捕捉什么?