Как извлечь значение из ответа SOAP XML с несколькими пространствами имен с помощью Rest-assured? - PullRequest
2 голосов
/ 03 августа 2020

У меня есть следующий SOAP Ответ на вызов, который я делаю с помощью 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>

Мне нужно извлечь несколько значений, например 788 в status:type в первом <return... block.

У меня есть тестовая утилита для проверки возвращаемых значений из ответа:

@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);
    }
}

Но в настоящее время возвращает 1 результат ~ пустую строку.

Это мне непонятно, где я ошибаюсь.

1 Ответ

1 голос
/ 03 августа 2020

При использовании XmlPath не предоставляйте пространства имен.

XmlPath path = XmlPath.from(xml);
    path.getList("Envelope.Body.liststatusResponse.return.type.text()").forEach(System.out::println);

Этот код возвращает:

788

Чтобы объявить пространства имен, вы должны сделать пространство имен XmlPath осведомленным в соответствии с документация :

given().
        config(RestAssured.config().xmlConfig(xmlConfig().with().namespaceAware(true))).
when().
         get("/package-db-xml").
then().
         body(hasXPath("/db:package-database", namespaceContext));

и, поскольку у вас есть несколько пространств имен, я бы просто использовал XmlPath

без пространства имен
...