XPath表达式无法匹配

时间:2016-04-28 05:06:12

标签: java xpath

我试图使用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;中没有任何价值。

这个问题可能很简单,但我无法确定问题所在。

感谢您的帮助。

3 个答案:

答案 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]