2 回答
TA贡献1998条经验 获得超6个赞
我知道上次我在 java 中使用 XPath 时遇到了命名空间问题,必须添加一个 namespaceContext 才能使其工作。
如果要在 XPath 中使用soapenv 命名空间,则需要“注册”它。你可以在下面找到我当时所做的事情。可能不是 100% 干净,但仍可能对您有所帮助
xpath.setNamespaceContext(new NamespaceContext() {
@Override
public String getNamespaceURI(String prefix) {
if("soapenv".equals(prefix)){
return "http://schemas.xmlsoap.org/soap/envelope/";
}else{
return null;
}
}
@Override
public String getPrefix(String namespaceURI) {
return null;
}
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
});
编辑:用我对您的代码的修复进行了测试运行,这是您期望看到的吗?
found node -> Header (namespace: http://schemas.xmlsoap.org/soap/envelope/)
TA贡献1815条经验 获得超10个赞
这是使一切正常工作所缺少的唯一代码行
factory.setNamespaceAware(true);
所以整个工作代码是
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new java.io.ByteArrayInputStream(payload.getBytes()));
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContext() {
@Override
public String getNamespaceURI(String prefix) {
if("soapenv".equals(prefix)){
return "http://schemas.xmlsoap.org/soap/envelope/";
}else{
return null;
}
}
@Override
public String getPrefix(String namespaceURI) {
return null;
}
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
});
XPathExpression expr = xpath.compile("//soapenv:Envelope//soapenv:Header//text()[normalize-space()]");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
添加回答
举报
