【问题标题】:Transforming SOAP Output to JSON issue将 SOAP 输出转换为 JSON 问题
【发布时间】:2016-01-06 14:17:45
【问题描述】:

我调用了一个 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&amp;cityCode=NY

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

【问题讨论】:

    标签: json xquery ibm-datapower jsoniq


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-12
      • 2022-10-05
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多