Каратэ - парсинг XML с пространством имен - PullRequest
0 голосов
/ 08 декабря 2018

Мне нужно разобрать и напечатать ns4: функция часть.Каратэ печатает его в формате JSON.Я попытался сослаться на этот ответ.Но я получаю 'ОШИБКА:' Пространство имен для префикса 'xsi' не объявлено. ' Ошибка, если используется предложенный xPath.то есть,

* def list = $Test1/Envelope/Body/getPlan/planSummary/feature[1]

Это мой XML: Он содержит много частей с различными значениями 'ns', но я привел здесь дополнительный текст.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Header/>
   <S:Body>
      <ns9:getPlan xmlns:ns10="http://xmlschema.test.com/xsd_v8" xmlns:ns9="http://xmlschema.test.com/srv/SMO_v4" xmlns:ns8="http://xmlschema.test.com/xsd/Customer_v2" xmlns:ns7="http://xmlschema.test.com/xsd/Customer/Customer_v4" xmlns:ns6="http://schemas.test.com/eca/common_types_2_1" xmlns:ns5="http://xmlschema.test.com/xsd/Customer/BaseTypes_1_0" xmlns:ns4="http://xmlschema.test.com/xsd_v4" xmlns:ns3="http://xmlschema.test.com/xsd/Enterprise/BaseTypes/types/ping_v1" xmlns:ns2="http://xmlschema.test.com/xsd/common/exceptions/Exceptions_v1_0">
        <ns9:planSummary xsi:type="ns4:Plan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <ns5:code>XPBSMWAT</ns5:code>
           <ns5:description>Test Plan</ns5:description>
           <ns4:category xsi:nil="true"/>
           <ns4:effectiveDate>2009-11-05</ns4:effectiveDate>
           <ns4:sharingGroupList>
              <ns4:sharingCode>CAD_DATA</ns4:sharingCode>
              <ns4:contributingInd>true</ns4:contributingInd>
           </ns4:sharingGroupList>
           <ns4:feature>
              <ns5:code>ABC</ns5:code>
              <ns5:description>Service</ns5:description>
              <ns5:descriptionFrench>Service</ns5:descriptionFrench>
              <ns4:poolGroupId xsi:nil="true"/>
              <ns4:switchCode/>
              <ns4:type/>
              <ns4:dtInd>false</ns4:dtInd>
              <ns4:usageCharge>0.0</ns4:usageCharge>
              <ns4:connectInd>false</ns4:connectInd>
           </ns4:feature>
        </ns9:planSummary>
      </ns9:getPlan>
   </S:Body>
</S:Envelope>

Это xPath, который я использовал;

Примечание: я сохранил выше xml в отдельном файле test1.xml.Я просто читаю его и анализирую значение.

* def Test1 = read('classpath:PP1/data/test1.xml')
* def list = $Test1/Envelope/Body/*[local-name()='getPlan']/*[local-name()='planSummary']/*[local-name()='feature']/*
* print list

Это ответ, который я получаю;

16:20:10.729 [ForkJoinPool-1-worker-1] INFO  com.intuit.karate - [print] [
  "ABC",
  "Service",
  "Service",
  "",
  "",
  "",
  "false",
  "0.0",
  "false"
]

Как я могу получить то же самое в XML

1 Ответ

0 голосов
/ 08 декабря 2018

Это интересно, я раньше такого не видел.Проблема была в том, что у вас есть атрибут с пространством имен xsi:nil="true", который вызывает проблемы, когда вы берете подмножество XML, но пространство имен больше не определяется.Если вы сначала удалите его, все будет работать.

Попробуйте это:

* remove Test1 //poolGroupId/@nil
* def temp = $Test1/Envelope/Body/getPlan/planSummary/feature

Другой подход, который вы могли бы попробовать, - это заменить строку, чтобы удалить неприятные вещи в XML перед выполнением XPath..

EDIT: добавлена ​​информация о том, как заменить строку с помощью Java.Ниже будет вырезана вся часть xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns4:Plan".

* string temp = Test1
* string temp = temp.replaceAll("xmlns:xsi[^>]*", "")
* print temp

Итак, вы поняли идею.Просто используйте регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...