2016-11-21 19 views
0

私は思っていたことを単純にしようとしています.Xpathノードの属性が特定の値であると主張してください。 XPathFactoryを使用してXpath属性を評価する

<?xml version="1.0" encoding="UTF-8"?><tag0:AAA_ControlRS xmlns:tag0="http://www.xmltravel.com/fab/2002/09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Target="test"  Version="2002A" xsi:type="AAA_ControlRS"> 
<tag0:TestInfo TestId="THFTEST"/> 
<tag0:SessionInfo CreateNewSession="true"/> 
<AAASessionId="8IzujBAVOPVQrO1ySpNBoJ9x"/> 
<tag0:ControlResponse Success="true"/> 
</tag0:AAA_ControlRS> 

( "true" または "false" を返します) <ControlResponse Success="true"/>とここに私のコードです:

//REQUEST 
    String controlRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n... 
//bunch of xml here"; 

    //RESPONSE 
    String myControlResponse = given(). 
      when(). 
      request(). 
      contentType("text/xml"). 
      body(myControlRequest). 
      when().post().andReturn().asString(); 

    //Parse response and get relevant node via Xpath 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    DocumentBuilder builder; 
    Document doc; 

    try { 
     builder = factory.newDocumentBuilder(); 
     doc = builder.parse(new InputSource((new StringReader(myControlResponse)))); 

     //Xpath Factory Object 
     XPathFactory xPathFactory = XPathFactory.newInstance(); 

     //Xpath Object 
     XPath xpath = xPathFactory.newXPath(); 

     String controlResponse = getNodeValue(doc, xpath); 

     assertEquals("true", controlResponse); 


    } catch (ParserConfigurationException | org.xml.sax.SAXException | IOException e) { 
     e.printStackTrace(); 
    } 
} 

private static String getNodeValue(Document doc, XPath xpath) { 
    String controlResponse = null; 
    try { 
     XPathExpression expr = 
       xpath.compile("//ControlResponse/@Success"); 
     controlResponse = (String) expr.evaluate(doc, XPathConstants.STRING); 
    } catch (XPathExpressionException e) { 
     e.printStackTrace(); 
    } 

    return controlResponse; 
} 

xpathがに評価する - :ノードは次のように何も値、onlya属性値を持っていません私が文字列が "真"であると予想するとnullです。 アトリビュート値を取得し、文字列「true」または「false」が含まれているかどうかを確認したい

私は何をしようとしていますか?

答えて

2

属性値を取得するには、XPath式として//ControlResponse/@Successを使用します。

名前空間に問題がある場合は、//*[local-name()="ControlResponse"]/@Successを使用してクイックチェックしてください。無関係なサンプル文書を使用して

例:

> cat ~/test.xml 
<root><foo bar="true"/></root> 
> xmllint --xpath '//foo/@bar' ~/test.xml 
bar="true" 

あなたのケースで期待どおりに、これは動作しない場合は、問題が再現されたXML文書を十分に示してください。

+0

ありがとう、私はコードを更新しましたが、XPath式はnullに評価されますか? – Steerpike

+0

@Steerpikeは答えを更新しました...あなたの入力XMLに名前空間がありますか? – Markus

+0

ありがとうございます。私は名前空間について確信していますが、私はグーグルだと私はあなたが正しいと思います。私は解析したい完全なXML応答を投稿しました(このXMLは応答として送信されます)。私はRestAssurred(試して)を使用していて、そのライブラリを使って名前空間を扱うことができるかもしれませんか? – Steerpike

関連する問題