我正在使用SOAP并由Rest-Assured进行测试。
我想通过Rest-Assured验证响应正文XML是否具有预期的节点值。但是我找不到我需要的节点。

这是我的回复XML。它具有几个名称空间。
我想获取此节点ns3:site的值

<soap-env:envelope xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap-env:body>
      <ns4:findsiteconfigurationbysmth xmlns:ns3="http://www.testsite.com/common" xmlns:ns2="http://www.testsite.com/plant" xmlns:ns4="someapi:com:plant" xmlns:ns5="someapi:com:reasoncode">
         <ns4:response>
            <ns2:ref>SiteWD:QWERTY</ns2:ref>
            <ns3:site>QWERTY</ns3:site>
            <ns3:description>test description</ns3:description>
            <ns3:timezone>Africa/Abidjan</ns3:timezone>
         </ns4:response>
      </ns4:findsiteconfigurationbysmth>
   </soap-env:body>
</soap-env:envelope>



以前,我将响应保存到String变量,并使用此代码进行验证。

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setNamespaceAware(true);
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document myXml = builder.parse(new InputSource(new StringReader(myStringXml)));

   NodeList node = myXml.getDocumentElement()
  .getElementsByTagNameNS("http://www.testsite.com/common", "site");
   node.item(0).getTextContent();


此代码有效!回应是QWERTY

现在,我正在尝试通过Rest-Assured进行验证。

.spec(defaultRequestSpecification(mySpec))
.config(RestAssuredConfig.config()
.xmlConfig(XmlConfig.xmlConfig()
.with().namespaceAware(true)
.declareNamespace("site", "http://www.testsite.com/common")))
.post()
.then()
.statusCode(200)
.body("site", equalTo("QWERTY"));


我的回应是

1 expectation failed.
XML path site doesn't match.
Expected: QWERTY
Actual: SiteWD:QWERTYQWERTYtest descriptionAfrica/Abidjan


我试图将声明的名称空间更改为“ ns3”,“ ns3:site”。与xPath相同的故事在body方法中-“ ns3”,“ ns3:site”,“ site”等。结果是相同的...来自ns3节点的单个文本字符串。

我做错了什么?请帮助我找出问题所在。
如何只获得一个节点?我应该改变什么?

最佳答案

根据REST Assured docs,以下内容应为您工作:

.config(RestAssuredConfig.config()
.xmlConfig(XmlConfig.xmlConfig()
.with()
.namespaceAware(true)
.declareNamespace("soap-env", "http://schemas.xmlsoap.org/soap/envelope/")
.declareNamespace("ns4", "someapi:com:plant")
.declareNamespace("ns3", "http://www.testsite.com/common")))
.post()
.then()
.statusCode(200)
.body("soap-env:envelope.soap-env:body.ns4:findsiteconfigurationbysmth.ns4:response.ns3:site.text()", equalTo("QWERTY"));

10-07 16:11