将SOAP输出转换为JSON问题

时间:2016-01-06 14:17:46

标签: json xquery ibm-datapower jsoniq

我调用了一个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.
}

1 个答案:

答案 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)
 }