Java 如何使用Rest-assured从多个名称空间的soapxml响应中验证特定节点?

Java 如何使用Rest-assured从多个名称空间的soapxml响应中验证特定节点?,java,xml,xpath,soap,rest-assured,Java,Xml,Xpath,Soap,Rest Assured,我正在使用SOAP,并通过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://

我正在使用SOAP,并通过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>

这个代码有效!回答是QWERTY

现在我试着用“放心”来验证它

.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节点的单个文本字符串

我做错了什么?请帮我找出问题所在。 如何仅获取一个节点?我应该更改什么?

根据,以下内容应该适用于您:

.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"));
对它的工作)非常感谢!但是我不明白为什么我要声明到所需节点的整个路径。
.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"));