Я успешно использую xml -вто во многих приложениях, но иногда ответ XML веб-службы выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<InfoLabel>
<Parcel>
<SiglaMittente>E3</SiglaMittente>
<NumeroSpedizione>800000009</NumeroSpedizione>
<TotaleColli>11</TotaleColli>
<TipoCollo />
<SiglaSedeDestino />
<DenominazioneMittente>GLS BOLOGNA</DenominazioneMittente>
<DenominazioneDestinatario>PROVA ETICHETTE</DenominazioneDestinatario>
<IndirizzoDestinatario>VIA XXX</IndirizzoDestinatario>
<CittaDestinatario>MILANO</CittaDestinatario>
<ProvinciaDestinatario>MI</ProvinciaDestinatario>
<DataSpedizione>03/03/20</DataSpedizione>
<DescrizioneSedeDestino>GLS Check</DescrizioneSedeDestino>
...other xml data..
</Parcel>
<Parcel>
...other xml data..
</Parcel>
</InfoLabel>
, где разница заключается в наличии самозакрывающегося теги (как TipoCollo в примере). Другие веб-сервисы обычно возвращают как открывающие, так и закрывающие теги с пробелом внутри.
Когда выполняется xml -внутрь, это приводит к ошибке:
RNX0353 - The XML document does not match the RPG variable; reason code 8.
, где
8. The XML document contains data that cannot be successfully assigned to the RPG variable. The RPG status code associated with the failure is 105. The exact subfield for which the error was detected is "infolabel.parcel(1).tipocollo"
Структура данных определяется следующим образом:
dcl-ds DsInfoLabel qualified inz;
SiglaMittente char(2) inz;
NumeroSpedizione zoned(9: 0) inz;
TotaleColli zoned(2: 0) inz;
TipoCollo zoned(1: 0) inz;
SiglaSedeDestino char(4) inz;
... other fields...
end-ds;
dcl-ds InfoLabel qualified inz;
NumParcel int(10) inz;
Parcel likeds(DsInfoLabel) dim(99);
end-ds;
Это код операции:
xml-into(e) InfoLabel %xml(resmsg_DATA: xmlopts);
where
xmlopts='doc=string trim=all case=any allowmissing=yes allowextra=yes path=InfoLabel countprefix=Num'
Система работает под управлением версии V7R2.
Как Насколько я знаю, нет другой опции, которая может быть установлена, чтобы избежать этой ситуации. Кроме того, этот веб-сервис должен использоваться как есть.
Есть ли что-то еще, что я могу сделать?
Да, я нашел обходной путь, он не объясняет почему, но таким образом данные могут быть найденным без ошибок: вместо зонированного подполя TotaleColli теперь определяется как char.
Спасибо