2016-04-28 17 views
2

Java(v 1.7)のXPathを使用してXMLからいくつかの情報を解析しようとしています。XPath式が一致しない

<soap:Fault xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <faultcode>code</faultcode> 
    <faultstring>string</faultstring> 
    <detail>detail</detail> 
</soap:Fault> 

私のコード::私のXMLは次のようになります

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

まずこれらを追加して

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

素晴らしい - これが現在機能しています。 Michaelの以前の返信と、ドキュメントビルダファクトリの名前空間を認識させることで、データはXPath式を使用してXMLから正しく解析されるようになりました。 – GarlicBread

0

名前空間の影響が原因である可能性があります。ローカル名は、以下の構文を与えるとのマッチングにより、名前空間の独立したタグを試すことができます。

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

あなたは名前空間なしで何か変更を確認できますか? – randominstanceOfLivingThing

+0

はい、これは動作します - ありがとうございます。しかし、以下のマイケル氏の返答によると、私はネームスペースを使いたいと思っています。 – GarlicBread

+0

名前空間で使用するコードを編集しました。 – randominstanceOfLivingThing

2

あなたはXPath.setNamespaceContext()メソッドを使用してURI「http://schemas.xmlsoap.org/soap/envelope/」に名前空間接頭辞「石鹸」をバインドする必要があります。そして、あなたが名前空間コンテキスト必要

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 

:あなたが名前空間を認識するドキュメントビルダーファクトリを必要とする

+0

私はNamespaceContextオブジェクトを作成し、getNamespaceURI()、getPrefix()、getPrefixes()をオーバーライドしてxPathオブジェクトに追加しましたが、まだマッチしません。接頭辞は "soap"、URIは "schemas.xmlsoap.org/soap/envelope/"です。 – GarlicBread

+0

これは現在機能しています。 NamespaceContextクラスと同様に、私はDocumentBuilderFactoryオブジェクトの名前空間を認識させる必要がありました。 – GarlicBread

関連する問題