Java 使用XPathFactory计算Xpath属性
我试着做一些非常简单的事情,我想,简单地断言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().
(将返回“真”或“假”)
这是我的代码:
//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);但我不清楚接下来该怎么办