【问题标题】:Evalute an Xpath attribute using XPathFactory使用 XPathFactory 评估 Xpath 属性
【发布时间】:2017-04-05 00:15:36
【问题描述】:

我正在尝试做一些我认为非常简单的事情,只需断言 Xpath 节点的属性是特定值。该节点没有值,只有一个属性值如下:- <ControlResponse Success="true"/>(将返回“true”或“false”)

<?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>

这是我的代码:

//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;
}

当我期望字符串为“true”时,xpath 的计算结果为 null。我想实现获取 属性值 并断言它是否包含字符串“true”或“false”

有没有更简单的方法来实现我想要做的事情?

【问题讨论】:

    标签: java xml xpath rest-assured


    【解决方案1】:

    要获取属性值,请使用//ControlResponse/@Success 作为 XPath 表达式。

    如果命名空间问题妨碍您,请使用//*[local-name()="ControlResponse"]/@Success 快速检查问题是否与命名空间相关。

    使用不相关的示例文档的示例:

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

    如果这在您的情况下没有按预期工作,请显示足够多的 XML 文档以表明问题是可重现的。

    【讨论】:

    • 谢谢,我更新了代码,但 XPath 表达式计算为 null?
    • @Steerpike 更新了答案...您的输入 XML 可能有命名空间吗?
    • 谢谢。我不确定命名空间,但我只是用谷歌搜索,我认为你是正确的。我已经发布了我希望解析的完整 XML 响应(此 XML 作为响应发送)。我正在使用 RestAssurred(正在尝试)并且可能能够使用该库处理命名空间?
    • @Steerpike 您发布的 XML sn-p 不是有效的 XML。更新了答案。
    • 我遇到的问题是,这是我从 WebService 获得的 sn-p 响应,所以我必须找到一种解析方法,以便我可以使用 xpath 读取值。我用过 factory.setNamespaceAware(true);但我不清楚从这里去哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2010-11-03
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多