Преобразование вывода SOAP в проблему JSON

Я вызвал сервис SOAP и хотел преобразовать его в JSON, используя XQuery, но всегда в результате говорилось, что есть токены ошибок:

Это мыло:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
 xmlns:NS1="http://www.inspirejo.com/soapwheather" <soapenv:Body>
  <NS1:wheatherResponse>
     <CountryName>United states</CountryName>
     <countryCode>USA</countryCode>
     <cityCode>NY</cityCode>
     <cityName>New york</cityName>
     <respCode>****************</respCode>
     <minDegree>12</minDegree>
     <maxDegree>21</maxDegree>
     <hummedity>21</hummedity>
     <windspeed>20</windspeed>
  </NS1:wheatherResponse>
</soapenv:Body>
</soapenv:Envelope>

Код XQuery:

    xquery version "1.0";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace xsd = "http://www.w3.org/2001/XMLSchema";
declare namespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
declare namespace NS1 = "http://www.inspirejo.com/soapwheather/";
declare option output:method "json";
declare option jsoniq-version "0.4.42";

let $soapresult := soapenv:Envelope/soapenv:Body/NS1:wheatherResponse
return{
    "countryCode" : $soapresult/countryCode,
    "cityCode"    : $soapresult/cityCode,
    "countryName" : $soapresult/countryName,
    "cityName"    : $soapresult/cityName,
    "minDegree"   : $soapresult/minDegree,
    "maxDegree"   : $soapresult/maxDegree,
    "hummedity"   : $soapresult/hummedity,
    "windSpeed"   : $soapresult/windSpeed
}

Я исправил ошибку токена, но вывод все еще и выходное преобразование: illegal character '{' at offset 1 of http://192.168.0.211:12019/inspire/wservice/wheatherRequest?countryCode=USA&cityCode=NY

.{.
    "countryCode" : null,
    "cityCode"    : null,
     "countryName"  : null,
     "cityName"     : null,
     "minDegree"    : null,
     "maxDegree"    :null,
      .. etc. all transformation result is null.
}

1 ответ

Определение пространства имен для NS1 отличается от определения, используемого в мыльном конверте (окончание / в объявлении). Ниже код протестирован в Zorba http://try.zorba.io/queries/xquery и дает правильный вывод. Обратите внимание на строку fn:, окружающую значения. Если вы не используете это, вы получите полные элементы.

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
declare namespace NS1 = "http://www.inspirejo.com/soapwheather";

let $soapEnv := <soapenv:Envelope   xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.inspirejo.com/soapwheather">
<soapenv:Body>
  <NS1:wheatherResponse>
 <CountryName>United states</CountryName>
 <countryCode>USA</countryCode>
 <cityCode>NY</cityCode>
 <cityName>New york</cityName>
 <respCode>****************</respCode>
 <minDegree>12</minDegree>
 <maxDegree>21</maxDegree>
 <hummedity>21</hummedity>
 <windspeed>20</windspeed>
</NS1:wheatherResponse>
</soapenv:Body>
</soapenv:Envelope>

let $soapresult := $soapEnv//NS1:wheatherResponse
return {
"countryCode" : fn:string($soapresult/countryCode),
"cityCode"    : fn:string($soapresult/cityCode),
"countryName" : fn:string($soapresult/countryName),
"cityName"    : fn:string($soapresult/cityName),
"minDegree"   : fn:string($soapresult/minDegree),
"maxDegree"   : fn:string($soapresult/maxDegree),
"hummedity"   : fn:string($soapresult/hummedity),
"windSpeed"   : fn:string($soapresult/windSpeed)
 }
Другие вопросы по тегам