Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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解析具有不同名称空间的xml_Java_Xml_Parsing_Xpath - Fatal编程技术网

在JAVA中使用XPath解析具有不同名称空间的xml

在JAVA中使用XPath解析具有不同名称空间的xml,java,xml,parsing,xpath,Java,Xml,Parsing,Xpath,我正在做这个小项目,我的任务是读取一个xml文件并对其进行解析,以便将其存储在类中。 下面是xml示例。它是用SOAP写的,我想做的是 <ns2:getNewTokenResponse xmlns:ns2="http://abc.examples.com/"> 这一部分解析了节点和子节点,以便我可以创建一个类,该类将“nodeName”作为一个属性,其值为“getNewTokenResponse”+会话密钥 <env:Envelope xmlns:env='http://

我正在做这个小项目,我的任务是读取一个xml文件并对其进行解析,以便将其存储在类中。 下面是xml示例。它是用SOAP写的,我想做的是

<ns2:getNewTokenResponse xmlns:ns2="http://abc.examples.com/">

这一部分解析了节点和子节点,以便我可以创建一个类,该类将“nodeName”作为一个属性,其值为“getNewTokenResponse”+会话密钥

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
    <env:Header>
    </env:Header>
    <env:Body>
        <ns2:getNewTokenResponse xmlns:ns2="http://abc.examples.com/">
            <return>
                {{session.key}}
            </return>
        </ns2:getNewTokenResponse>
    </env:Body>
</env:Envelope>

{{session.key}

但我真正的问题是,我发现了许多很好的示例代码,名称空间并没有前缀,xml文件的结构可能会有所不同。所以在这里,我对完成任务感到困惑。我将感谢你的建议。干杯:D

要使用Java中的名称空间执行XPath查询,我相信您需要执行以下操作:

XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContext() {
    @Override
    public String getNamespaceURI(String prefix) {
        switch (prefix) {
            case "env":
                return "http://schemas.xmlsoap.org/soap/envelope/";
            case "ns2":
                return "http://abc.examples.com/";
        }

        return XMLConstants.NULL_NS_URI;
    }

    @Override
    public String getPrefix(String namespaceURI) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Iterator getPrefixes(String namespaceURI) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
});

Node getNewTokenResp = 
     (Node) xpath.evaluate("/env:Envelope/env:Body/ns2:getNewTokenResponse", 
     document, XPathConstants.NODE);

您还需要调用
.setNamespaceAware(true)DocumentBuilder
以解析文档之前,请先在
DocumentBuilder工厂中执行code>。

谢谢您的回答。但我需要从标记中提取的是“getNewTokenResponse”。它可以是“deleteTokenResponse”或“modifyTokenResponse”之类的。因此,我可以将它们作为字符串存储到属性中….:D@EugeneYu很抱歉我忽略了你的评论。如果
Body
元素下的节点可能不同,那么可以使用XPath
/env:Envelope/env:Body/*
而不是上面显示的XPath来选择它。