2016-04-28 67 views
2

我试图从Java中使用XPath解析出XML中的一些信息(1.7版)。我的XML看起来是这样的:XPath表达式无法匹配

<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表达式,它表明,一个匹配时。但是,当我在一个独立的程序中运行它时,我在“faultCode”中没有任何价值。

这个问题可能很简单,但我无法确定问题是什么。

感谢您的任何帮助。

+0

我想只是'/ Fault/faultcode'。尝试一下 !! – soufrk

回答

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

+0

太好了 - 现在正在工作。随着迈克尔早些时候的回复以及增加了对文档构建器工厂名称空间的了解,数据现在可以使用XPath表达式从XML中正确解析。 – GarlicBread

0

这可能是因为命名空间的影响。您可以通过与当地的名给下面的语法匹配尝试命名空间独立的标签:

/*[local-name()='Fault' and namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/']/*[local-name()='faultcode']/text()[1] 
+0

DId你看到没有命名空间的任何改变? – randominstanceOfLivingThing

+0

是的,这是可行的 - 谢谢。但是,我想使用命名空间,根据下面的Michael的回复。 – GarlicBread

+0

我编辑了代码,将它与命名空间一起使用。 – randominstanceOfLivingThing

2

你应该使用XPath.setNamespaceContext()方法绑定的命名空间前缀“肥皂”的URI“http://schemas.xmlsoap.org/soap/envelope/”。

+0

我创建了一个NamespaceContext对象,重写了getNamespaceURI(),getPrefix()和getPrefixes()并将其添加到xPath对象,但仍然没有匹配。前缀是“soap”,URI是“schemas.xmlsoap.org/soap/envelope/”。 – GarlicBread

+0

这现在正在工作。和NamespaceContext类一样,我需要知道DocumentBuilderFactory对象名称空间。 – GarlicBread