我试图使用Java中的XPath(v 1.7)从XML中解析出一些信息。我的XML看起来像这样:
<soap:Fault xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>code</faultcode>
<faultstring>string</faultstring>
<detail>detail</detail>
</soap:Fault>
我的代码:
final InputSource inputSource = new InputSource(new StringReader(xmlContent));
final DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final Document document = documentBuilder.parse(inputSource);
final XPath xPath = XPathFactory.newInstance().newXPath();
final String faultCode = xPath.compile("/soap:Fault/faultcode/text()[1]").evaluate(document);
我在使用XML内容的在线检查程序中尝试了XPath表达式,并建议进行匹配。但是,当我在一个独立的程序中运行它时,我在&#34; faultCode&#34;中没有任何价值。
这个问题可能很简单,但我无法确定问题所在。
感谢您的帮助。
答案 0 :(得分:2)
您应该使用where UserID in (2,3,123... )
方法将名称空间前缀“soap”绑定到URI“http://schemas.xmlsoap.org/soap/envelope/”。
答案 1 :(得分:1)
首先,您需要一个名称空间感知文档构建器工厂:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
然后你需要一个命名空间上下文:
NamespaceContext nsContext = new NamespaceContext() {
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
@Override
public String getPrefix(String namespaceURI) {
return "soap";
}
@Override
public String getNamespaceURI(String prefix) {
return "http://schemas.xmlsoap.org/soap/envelope/";
}
};
xPath.setNamespaceContext(nsContext);
通过这些添加,您的代码应该可以正常工作。
关于命名空间上下文,我建议你阅读http://www.ibm.com/developerworks/xml/library/x-nmspccontext/index.html。
答案 2 :(得分:0)
可能是因为命名空间效应。您可以通过与提供以下语法的local-name匹配来尝试名称空间独立标记:
/*[local-name()='Fault' and namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/']/*[local-name()='faultcode']/text()[1]