Java 使用XPathFactory计算Xpath属性

Java 使用XPathFactory计算Xpath属性,java,xml,xpath,rest-assured,Java,Xml,Xpath,Rest Assured,我试着做一些非常简单的事情,我想,简单地断言Xpath节点的属性是一个特定的值。节点没有值,只有如下属性值:- (将返回“真”或“假”) 这是我的代码: //REQUEST String controlRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n... //bunch of xml here"; //RESPONSE String myControlResponse = given().

我试着做一些非常简单的事情,我想,简单地断言Xpath节点的属性是一个特定的值。节点没有值,只有如下属性值:-

(将返回“真”或“假”)


这是我的代码:

//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;
}
//请求
字符串controlRequest=“\n…”。。。
//这里有一堆xml”;
//回应
字符串myControlResponse=given()。
when()。
请求()。
contentType(“text/xml”)。
正文(myControlRequest)。
when().post().andReturn().asString();
//解析响应并通过Xpath获取相关节点
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
文档生成器;
文件文件;
试一试{
builder=factory.newDocumentBuilder();
doc=builder.parse(新的InputSource((新的StringReader(myControlResponse)));
//Xpath工厂对象
XPathFactory XPathFactory=XPathFactory.newInstance();
//Xpath对象
XPath=xPathFactory.newXPath();
字符串controlResponse=getNodeValue(doc,xpath);
assertEquals(“真”,controlResponse);
}catch(ParserConfigurationException | org.xml.sax.SAXException | IOException e){
e、 printStackTrace();
}
}
私有静态字符串getNodeValue(文档文档,XPath){
字符串controlResponse=null;
试一试{
XPathExpression=
compile(“//ControlResponse/@Success”);
controlResponse=(String)expr.evaluate(doc,XPathConstants.String);
}捕获(XPathExpressionException e){
e、 printStackTrace();
}
返回控制响应;
}
当我期望字符串“true”时,xpath的计算结果为null。我想实现获取属性值并断言它是否包含字符串“true”或“false”

有没有更简单的方法来实现我的目标

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

如果名称空间问题阻碍了您的工作,请使用
/*[local-name()=“ControlResponse”]/@Success
快速检查问题是否与名称空间相关

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

> cat ~/test.xml
<root><foo bar="true"/></root>
> xmllint --xpath '//foo/@bar' ~/test.xml
 bar="true"
>cat~/test.xml
>xmllint--xpath'//foo/@bar'~/test.xml
bar=“true”
如果这在您的案例中没有按预期工作,请显示足够多的XML文档,说明问题是可重现的。

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

如果名称空间问题阻碍了您的工作,请使用
/*[local-name()=“ControlResponse”]/@Success
快速检查问题是否与名称空间相关

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

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

如果这在您的案例中没有达到预期效果,请显示足够多的XML文档,说明问题是可重复的。

谢谢,我更新了代码,但XPath表达式evalutes为null?@Steerpike更新了答案。。。您的输入XML可能有名称空间?谢谢。我不确定名称空间,但我只是在谷歌上搜索了一下,我认为你是对的。我已经发布了我希望解析的完整XML响应(此XML作为响应发送)。我正在使用restasurred(尝试),并且可能能够使用该库处理名称空间?@Steerpike您发布的XML片段不是有效的XML。我遇到的问题是,这是Web服务提供给我的代码片段响应,因此我必须找到一种解析方法,以便使用xpath读取值。我使用过factory.setNamespaceAware(true);但是我不知道从这里该怎么办谢谢,我更新了代码,但是XPath表达式的值为null?@Steerpike更新了答案。。。您的输入XML可能有名称空间?谢谢。我不确定名称空间,但我只是在谷歌上搜索了一下,我认为你是对的。我已经发布了我希望解析的完整XML响应(此XML作为响应发送)。我正在使用restasurred(尝试),并且可能能够使用该库处理名称空间?@Steerpike您发布的XML片段不是有效的XML。我遇到的问题是,这是Web服务提供给我的代码片段响应,因此我必须找到一种解析方法,以便使用xpath读取值。我使用过factory.setNamespaceAware(true);但我不清楚接下来该怎么办