【问题标题】:Parsing XML response of SOAP web service with RPG and HTTPLIB使用 RPG 和 HTTPLIB 解析 SOAP Web 服务的 XML 响应
【发布时间】:2022-01-14 16:40:04
【问题描述】:

我想用 ILE RPG (Fully-Free RPG) 在一个数据结构中解析这个 xml 响应,其中包含一个货币字段和一个值字段。

这是我对soap webservice的回复:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <GetCurrentExchangeRatesResult>&lt;MNBCurrentExchangeRates&gt;&lt;Day date="2021-12-09"&gt;&lt;Rate unit="1" curr="AUD"&gt;231,49&lt;/Rate&gt;&lt;Rate unit="1" curr="BGN"&gt;187,05&lt;/Rate&gt;&lt;Rate unit="1" curr="BRL"&gt;58,41&lt;/Rate&gt;&lt;Rate unit="1" curr="CAD"&gt;254,93&lt;/Rate&gt;&lt;Rate unit="1" curr="CHF"&gt;350,64&lt;/Rate&gt;&lt;Rate unit="1" curr="CNY"&gt;50,92&lt;/Rate&gt;&lt;Rate unit="1" curr="CZK"&gt;14,38&lt;/Rate&gt;&lt;Rate unit="1" curr="DKK"&gt;49,20&lt;/Rate&gt;&lt;Rate unit="1" curr="EUR"&gt;365,85&lt;/Rate&gt;&lt;Rate unit="1" curr="GBP"&gt;426,84&lt;/Rate&gt;&lt;Rate unit="1" curr="HKD"&gt;41,45&lt;/Rate&gt;&lt;Rate unit="1" curr="HRK"&gt;48,61&lt;/Rate&gt;&lt;Rate unit="100" curr="IDR"&gt;2,25&lt;/Rate&gt;&lt;Rate unit="1" curr="ILS"&gt;104,13&lt;/Rate&gt;&lt;Rate unit="1" curr="INR"&gt;4,28&lt;/Rate&gt;&lt;Rate unit="1" curr="ISK"&gt;2,48&lt;/Rate&gt;&lt;Rate unit="100" curr="JPY"&gt;284,60&lt;/Rate&gt;&lt;Rate unit="100" curr="KRW"&gt;27,50&lt;/Rate&gt;&lt;Rate unit="1" curr="MXN"&gt;15,41&lt;/Rate&gt;&lt;Rate unit="1" curr="MYR"&gt;76,66&lt;/Rate&gt;&lt;Rate unit="1" curr="NOK"&gt;36,17&lt;/Rate&gt;&lt;Rate unit="1" curr="NZD"&gt;219,85&lt;/Rate&gt;&lt;Rate unit="1" curr="PHP"&gt;6,41&lt;/Rate&gt;&lt;Rate unit="1" curr="PLN"&gt;79,17&lt;/Rate&gt;&lt;Rate unit="1" curr="RON"&gt;73,91&lt;/Rate&gt;&lt;Rate unit="1" curr="RSD"&gt;3,11&lt;/Rate&gt;&lt;Rate unit="1" curr="RUB"&gt;4,39&lt;/Rate&gt;&lt;Rate unit="1" curr="SEK"&gt;35,70&lt;/Rate&gt;&lt;Rate unit="1" curr="SGD"&gt;236,93&lt;/Rate&gt;&lt;Rate unit="1" curr="THB"&gt;9,66&lt;/Rate&gt;&lt;Rate unit="1" curr="TRY"&gt;23,50&lt;/Rate&gt;&lt;Rate unit="1" curr="UAH"&gt;11,93&lt;/Rate&gt;&lt;Rate unit="1" curr="USD"&gt;323,22&lt;/Rate&gt;&lt;Rate unit="1" curr="ZAR"&gt;20,47&lt;/Rate&gt;&lt;/Day&gt;&lt;/MNBCurrentExchangeRates&gt;</GetCurrentExchangeRatesResult>
        </GetCurrentExchangeRatesResponse>
    </s:Body>
</s:Envelope>

货币仅用 &lt 分隔。
我这样尝试过,但是我的变量 xmlout 在 xml-into 之后是空的。

dcl-ds xmlout qualified;
  Tempout char(2129);
END-DS;   

xml-into xmlout %xml(postResult: 'case=any ns=remove allowextra=yes +
    path=Envelope/Body/GetCurrentExchangeRatesResponse/GetCurrentExchangeRatesResult');      

那么我如何更改或扩展我的 to 代码以将所有货币及其值放入结构化 ds 中?

【问题讨论】:

  • 如果他们将 XML 放入 SOAP (XML) 有效负载中,而不是需要转义和解析的转义字符串化 XML 字符串,而不只是一些应该很大的简单 XPath,一切都会更容易XML 有效负载.....
  • 懒惰的开发人员这样做是因为他们不想弄清楚如何处理xs:any,而宁愿只是说他们将制作有效负载xs:string并将其变成别人的问题
  • 找到更好的构建网络服务?
  • 是的很好,但客户想使用这个……

标签: xml soap websphere rpgle rpg


【解决方案1】:

对于第一个 XML-INTO,编码 xmlout.TempOut 而不仅仅是 xmlout。在 XML 文档中,GetCurrentExchangeRatesResult 与数据结构不匹配。

那么您需要第二个 XML-INTO 来解析 xmlout.TempOut 中的新 XML 文档。

类似这样的东西,虽然 varchar 可能不是所有数据类型的正确数据类型。

dcl-ds MNBCurrentExchangeRates qualified;
   dcl-ds day;                           
      date date(*iso);                   
      num_rate int(10);                  
      dcl-ds rate dim(500);              
         unit varchar(10);               
         curr varchar(10);               
         value varchar(20);              
      end-ds;                            
   end-ds;                               
end-ds; 
                       
xml-into MNBCurrentExchangeRates 
         %xml(xmlout.Tempout  
            : 'case=any countprefix=num_ datasubf=value');  

提示:在开发新的 XML-INTO 时,首先避免使用 allowextra 或 allowmissing 选项。在您的数据结构与一般 XML 文档匹配之前,请使用不带任何额外或缺失 XML 项的简化版本的文档。如果您过早编写 allowextra=yes 或 allowmissing=yes 代码,XML-INTO 将接受几乎所有内容而不会给出任何错误消息。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多