无法使用不同的命名空间解析XML

时间:2015-08-10 14:33:51

标签: java xml xpath

我有一个这样的示例XML:

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

此代码用于解析它:

XPath xpath = XPathFactory.newInstance().newXPath();
HashMap nsMap = getNameSpaceMap(input);
xpath.setNamespaceContext(new NamespaceContext() {
    @Override
    public String getNamespaceURI(String prefix) {
        if(nsMap.has(prefix)){
           return nsMap.get(prefix);
        }
        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("/Envelope/Body/getNewTokenResponse/return", 
     document, XPathConstants.NODE);

由于没有用于命名空间的前缀,它不会返回正确的值。

有没有更好的解析方法?

1 个答案:

答案 0 :(得分:0)

您应该使用/s:Envelope/s:Body/p:getNewTokenResponse/p:return作为XPath表达式,并提供将s映射到http://schemas.xmlsoap.org/soap/envelope/phttp://abc.examples.com/的命名空间上下文。