XML -INTO не работает при наличии самозакрывающегося тега - PullRequest
0 голосов
/ 03 марта 2020

Я успешно использую 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.

Спасибо

1 Ответ

0 голосов
/ 04 марта 2020

Оказывается, что статус RPG 105 означает «Недопустимые символы в символе в цифру c функции преобразования».

Итак, «парсер возвращает значение, которое не может быть преобразовано в число. В этом случае синтаксический анализатор перенастраивает пробел, и% De c (который эффективно используется под обложками) не может преобразовать пробелы в ноль. IBM попросили изменить это, но пока мы застряли с этим. "; это не мои слова: эксперт помог мне.

Решение состоит в том, чтобы определить символьные поля для данных, которые могут быть не установлены.

...