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;
添加回答
舉報