英文:
How to extract value from SOAP XML response with multiple namespaces using Rest-assured?
问题
我有以下来自我使用Rest Assured进行调用的SOAP响应:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<epns:context xmlns:epns="http://mywebservice/v6">
<epns:userId>SYSTEM</epns:userId>
<epns:systemId>WEBSERVICE</epns:systemId>
<epns:realmId />
</epns:context>
</env:Header>
<S:Body>
<ns0:liststatusResponse xmlns:ns0="http://mywebservice/v6/workflow" xmlns:asst="http://mywebservice/v6" xmlns:status="http://mywebservice/v6" xmlns:thirdparty="http://mywebservice/v6/thirdparty/v6">
<return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="status:agreementstatus">
<status:level>IN-PROGRESS</status:level>
<status:nextWorkDate>2020-07-31T09:36:50+01:00</status:nextWorkDate>
<status:type>788</status:type>
<status:agreementNumber>89ADFGH</status:agreementNumber>
</return>
</ns0:liststatusResponse>
</S:Body>
</S:Envelope>
我需要提取多个值,例如在第一个<return...>
块中的status:type
中的788
。
我有一个用于检查响应中返回的值的测试工具:
@Test
public static void xmlPathTester() {
XmlPath xmlPath = new XmlPath(XML);
List<String> results = xmlPath.getList("S:Envelope.S:Body.ns0:liststatusResponse.return.status:type.text()");
for (String result : results) {
System.out.println(result);
}
}
但是目前它只返回一个结果,即一个空字符串。
我不清楚我哪里出错了。
英文:
I have the following SOAP Response returned from a call I make using Rest Assured:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<epns:context xmlns:epns="http://mywebservice/v6">
<epns:userId>SYSTEM</epns:userId>
<epns:systemId>WEBSERVICE</epns:systemId>
<epns:realmId />
</epns:context>
</env:Header>
<S:Body>
<ns0:liststatusResponse xmlns:ns0="http://mywebservice/v6/workflow" xmlns:asst="http://mywebservice/v6" xmlns:status="http://mywebservice/v6" xmlns:thirdparty="http://mywebservice/v6/thirdparty/v6">
<return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="status:agreementstatus">
<status:level>IN-PROGRESS</status:level>
<status:nextWorkDate>2020-07-31T09:36:50+01:00</status:nextWorkDate>
<status:type>788</status:type>
<status:agreementNumber>89ADFGH</status:agreementNumber>
</return>
</ns0:liststatusResponse>
</S:Body>
</S:Envelope>
I need to extract several values, for example788
in status:type
in the first <return...
block.
I have a test utility for checking returned values from the response:
@Test
public static void xmlPathTester() {
XmlPath xmlPath = new XmlPath(XML);
List<String> results = xmlPath.getList("S:Envelope.S:Body.ns0:liststatusResponse.return.status:type.text()");
for (String result : results) {
System.out.println(result);
}
}
But this currently returns 1 result ~ an empty String.
It's not clear to me where I am going wrong.
答案1
得分: 1
"When you use XmlPath, don't provide namespaces."
XmlPath path = XmlPath.from(xml);
path.getList("Envelope.Body.liststatusResponse.return.type.text()").forEach(System.out::println);
This code returns:
788
In order to declare namespaces you have to make XmlPath namespace aware as per documentation:
given().
config(RestAssured.config().xmlConfig(xmlConfig().with().namespaceAware(true))).
when().
get("/package-db-xml").
then().
body(hasXPath("/db:package-database", namespaceContext));
and since you have multiple namespaces I would just use non-namespace XmlPath
<details>
<summary>英文:</summary>
When you use XmlPath, don't provide namespaces.
XmlPath path = XmlPath.from(xml);
path.getList("Envelope.Body.liststatusResponse.return.type.text()").forEach(System.out::println);
This code returns:
788
In order to declare namespaces you have to make XmlPath namespace aware as per [documentation][1]:
given().
config(RestAssured.config().xmlConfig(xmlConfig().with().namespaceAware(true))).
when().
get("/package-db-xml").
then().
body(hasXPath("/db:package-database", namespaceContext));
and since you have multiple namespaces I would just use non-namespace XmlPath
[1]: https://github.com/rest-assured/rest-assured/wiki/Usage#xml-namespaces
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论