我有一个这样的示例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);
由于没有用于命名空间的前缀,它不会返回正确的值。
有没有更好的解析方法?
答案 0 :(得分:0)
您应该使用/s:Envelope/s:Body/p:getNewTokenResponse/p:return
作为XPath表达式,并提供将s
映射到http://schemas.xmlsoap.org/soap/envelope/
和p
到http://abc.examples.com/
的命名空间上下文。