【问题标题】:Parsing xml that has different namespaces using XPath in JAVA在JAVA中使用XPath解析具有不同命名空间的xml
【发布时间】:2013-01-01 18:23:48
【问题描述】:

我正在做这个小项目,我的任务是读取一个 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>

但我真正的问题是,我发现了很多很好的示例代码,命名空间没有前缀,xml 文件的结构可以变化。所以在这里我很困惑以完成任务。我会很感激任何建议。干杯:D

【问题讨论】:

    标签: java xml parsing xpath


    【解决方案1】:

    要在 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);
    

    在创建 DocumentBuilder 以解析文档之前,您还需要在 DocumentBuilderFactory 上调用 .setNamespaceAware(true);

    【讨论】:

    • 感谢您的回答。但我需要从标签中提取的是“getNewTokenResponse”。它可以是“deleteTokenResponse”或“modifyTokenResponse”之类的。所以我可以将它们作为字符串存储到一个属性中......:D
    • @EugeneYu 很抱歉我忽略了你的评论。如果Body 元素下方的节点可以变化,那么您可以使用 XPath /env:Envelope/env:Body/* 而不是我上面显示的 XPath 来选择它。
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2011-10-09
    • 1970-01-01
    • 2012-06-09
    • 2014-02-06
    • 2012-07-23
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多