1

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

1 回答 1

0

NS1 的命名空间定义与肥皂信封中使用的命名空间定义不同(在声明中结束 /)。下面的代码在 Zorba http://try.zorba.io/queries/xquery中进行了测试,并给出了正确的输出。注意围绕值的 fn:string。如果您不使用它,您将获得完整的元素。

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)
 }
于 2016-01-06T16:34:17.627 回答