Преобразование вывода 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)
}