我调用了一个SOAP服务,并喜欢使用XQuery将其转换为JSON,但结果总是说有错误标记:
这是SOAP:
<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.
}
答案 0 :(得分:0)
NS1的名称空间定义与soap信封中使用的名称空间定义不同(结尾/在teh声明中)。 下面的代码在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)
}