ЭДО

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

Игорь Столяров писал(а): 10 Февраль 2023, 12:22 Штатный XML класс прекрасно считывает и парсит пакет ЭДО c русскими тегами (после конвертации в UTF-8) !
В Clarion 11 может и работает. В Clarion 6 вместо русских тегов символы xxxxx
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Admin писал(а): 13 Февраль 2023, 4:39 В Clarion 6 вместо русских тегов символы xxxxx
Есть такая буква ! Не используйте метод FromXMLFile() в C6.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Вот аналог метода FromXMLFile(), без проблем с русскими буквами в C6:

Код: Выделить всё

XMLDoc  &Document,AUTO
  Code
  XMLDoc &= XMLStringToDOM(StrXML)  ! В строке StrXML - загруженный XML файл
  If Not (XMLDoc &= Null)
     If DOMToQueue(XMLDoc,Loc:QXML,'RootTag','RowTag')
        If Records(Loc:QXML) > 1 then Message('Поехали !').
     end
     XMLDoc.Release()
  end
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Простой пример работы с сабжем (парсим русский XML).
Находим в документе ЭДО содержание и показываем значения тегов и аттрибутов.
Для тех кому интересна технология работы с XML через штатный класс Clarion. :)
Без левых прибамбасов и проще детской игры в крысу ! ;)

Пример см. viewtopic.php?t=4976
Последний раз редактировалось Игорь Столяров 19 Февраль 2023, 12:24, всего редактировалось 2 раза.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Перебор тегов и атрибутов в цикле, локальные флаги... Не, спасибо. Да и желания копаться в устаревшей библиотеке, которая не поддерживает современные методы работы с xml, совсем нет. Лучше уж easy xml купить, если использование скриптов как стандартный интерфейс к нестандартным для клариона вещам, не устраивает. Там, конечно, тоже смотреть надо, но я, в целом, в Михаила верю. ПыСы. Я когда-то давно пробовал посмотреть код внутри "штатного" парсера xml, мне плохо стало, закрыл, и сделал на скриптах, где все просто и понятно, как капуста.

Если интересно, вот выжимка загрузки накладной в Егаис, используя xpath. Почувствуйте разницу.

Код: Выделить всё

getDocNS_r  routine   !загрузить накладную (нестандартная, версия 4)
   DATA
lor:group group, pre()
lor:inn  string(20), name('oref:UL/oref:INN')
lor:kpp  string(20), name('oref:UL/oref:KPP')
lor:idPost  string(20), name('oref:UL/oref:ClientRegId')
lor:docNum  string(20), name('wb:NUMBER')
lor:docDate string(20), name('wb:Date')
lor:name    string(80), name('oref:UL/oref:ShortName')
lor:address string(150), name('oref:UL/oref:address/oref:description')
lor:flagOwner string(10), name('wb:ChangeOwnership')
 .

lor:queue queue, pre()
lor:ident       string(40), name('wb:Identity')
lor:kol         string(20), name('wb:Quantity')
lor:cena        string(20), name('wb:Price')
lor:alcoCode    string(40), name('wb:Product/pref:AlcCode')
lor:alcoVal     string(20), name('wb:Product/pref:AlcVolume')
lor:alcoCap     string(20), name('wb:Product/pref:Capacity')
lor:alcoProdCode  string(20), name('wb:Product/pref:ProductVCode')
lor:formaA      string(40), name('wb:FARegId')
lor:formaB      string(40), name('wb:InformF2/ce:F2RegId')

lor:idProizv    string(20), name('wb:Product/pref:Producer/oref:UL/oref:ClientRegId')
lor:NameProizv  string(150), name('wb:Product/pref:Producer/oref:UL/oref:ShortName')
lor:NameProizvF string(150), name('wb:Product/pref:Producer/oref:UL/oref:FullName')
lor:INNProizv   string(20), name('wb:Product/pref:Producer/oref:UL/oref:INN')
lor:KPPProizv   string(20), name('wb:Product/pref:Producer/oref:UL/oref:KPP')
lor:CountryProizv  string(10), name('wb:Product/pref:Producer/oref:UL/oref:address/oref:Country')
lor:RegionProizv   string(10), name('wb:Product/pref:Producer/oref:UL/oref:address/oref:RegionCode')
lor:IndexProizv    string(20), name('wb:Product/pref:Producer/oref:UL/oref:address/oref:Index')
lor:AdressProizv   string(255), name('wb:Product/pref:Producer/oref:UL/oref:address/oref:description')

lor:idProizv_ts    string(20), name('wb:Product/pref:Producer/oref:TS/oref:ClientRegId')
lor:NameProizv_ts  string(150), name('wb:Product/pref:Producer/oref:TS/oref:ShortName')
lor:NameProizvF_ts string(150), name('wb:Product/pref:Producer/oref:TS/oref:FullName')
lor:INNProizv_ts   string(20), name('wb:Product/pref:Producer/oref:TS/oref:INN')
lor:KPPProizv_ts   string(20), name('wb:Product/pref:Producer/oref:TS/oref:KPP')
lor:CountryProizv_ts  string(10), name('wb:Product/pref:Producer/oref:TS/oref:address/oref:Country')
lor:RegionProizv_ts   string(10), name('wb:Product/pref:Producer/oref:TS/oref:address/oref:RegionCode')
lor:IndexProizv_ts    string(20), name('wb:Product/pref:Producer/oref:TS/oref:address/oref:Index')
lor:AdressProizv_ts   string(255), name('wb:Product/pref:Producer/oref:TS/oref:address/oref:description')

lor:idProizv_fo    string(20), name('wb:Product/pref:Producer/oref:FO/oref:ClientRegId')
lor:NameProizv_fo  string(150), name('wb:Product/pref:Producer/oref:FO/oref:ShortName')
lor:NameProizvF_fo string(150), name('wb:Product/pref:Producer/oref:FO/oref:FullName')
lor:INNProizv_fo   string(20), name('wb:Product/pref:Producer/oref:FO/oref:INN')
lor:KPPProizv_fo   string(20), name('wb:Product/pref:Producer/oref:FO/oref:KPP')
lor:CountryProizv_fo  string(10), name('wb:Product/pref:Producer/oref:FO/oref:address/oref:Country')
lor:RegionProizv_fo   string(10), name('wb:Product/pref:Producer/oref:FO/oref:address/oref:RegionCode')
lor:IndexProizv_fo    string(20), name('wb:Product/pref:Producer/oref:FO/oref:address/oref:Index')
lor:AdressProizv_fo   string(255), name('wb:Product/pref:Producer/oref:FO/oref:address/oref:description')

lor:nameTovar      string(255), name('wb:Product/pref:ShortName')
lor:nameTovarFull  string(255), name('wb:Product/pref:FullName')
.

code

  Loc:NameTmp=GetNameTmp(FsAccess:ActiveUserDir,'xml',0)   !имена временных файлов
  Loc:NameVbsTmp=GetNameTmp(FsAccess:ActiveUserDir,'vbs',0)
  Loc:NameOutTmp=GetNameTmp(FsAccess:ActiveUserDir,'txt',0)

  fsXmlPar.init(Loc:NameTmp,Loc:NameVbsTmp,Loc:NameOutTmp)
  fsXmlPar.EgaisNameSpace(4,0)
  fsXmlPar.UnicodeRestr
  fsXmlPar.UnicodeFieldAdd('address/oref:description')
  fsXmlPar.LoadGroupNS('//ns:Document/ns:WayBill_v4/wb:Header','lor:group',lor:group)    !реквизиты шапки накладной
  fsXmlPar.LoadGroupNS('//ns:Document/ns:WayBill_v4/wb:Header/wb:Shipper','lor:group',lor:group)
  fsXmlPar.LoadQueueNS('//ns:Document/ns:WayBill_v4/wb:Content/wb:Position','lor:queue',lor:queue)  !строки накладной
  fsXmlPar.MakeScript(1)
  if fsXmlPar.ErrorCode<>0
     FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
  .
  fsXmlPar.kill

C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Перебор всех тегов в тушке XML - это всего лишь пример упрощённой (но универсальной !) обработки любого XML.
Я хотел показать технологическую возможность распарса русских XML с [***] структурой, а не удивить девушку. ;)

А в самом классе конечно есть методы прямого доступа к тегам - пожалуйста юзайте.
Точно также можно загружать списки по полному имени тега как в Вашем примере.
Только напрямую из XML в Group / Queue. Вся работа с ГИС "Меркурий" на этом построена.
finsoftrz писал(а): 14 Февраль 2023, 9:47

Код: Выделить всё

lor:AdressProizv   string(255), name('wb:Product/pref:Producer/oref:UL/oref:address/oref:description')
Не напарывались ещё на ограничение длины имён переменных в Clarion ? Я - да. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Напарывался, причём именно в Меркурии. Иногда приходится расширять. А что делать? Информацию из xml не только надо прочитать, но ещё и в окне в полях ввода вывести и т.п.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Как в моем примере, у Вас не получится. Xpath отсутствует в "штатном" парсер, а это принципиально.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

finsoftrz писал(а): 14 Февраль 2023, 10:32 Xpath отсутствует в "штатном" парсер, а это принципиально
Это да. Но как я понимаю (я не всегда всё понимаю правильно :D) XPath - это намного больше, чем расширение имён тегов.
А конкретно расширение имён тегов можно отработать через макроподстановки, как и полные длинные имена тегов.
Гипотетически. Думал я. Бу реальная задача - попробую. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

ЭДО

Сообщение Дед Пахом »

Буквально на днях просили помочь в загрузке информации о платежах, список AccountQ и дочерний список PaymentQ, и связь по тэгу Account/Id/IBAN (то есть в ключевое поле PaymentQ.OwnrIBAN надо записывать IBAN из родительского тэга Account/Id/IBAN):

Код: Выделить всё

  IF xDoc.Load(xmlFile)
    !- load all accounts
    xDoc.Load(AccountQ, 'Account')
    
    !- define the Many-to-one relation
    xDoc.SetFieldTagName('OwnrIBAN', 'parent::Account/Id/IBAN', TRUE)

    !- load all payments
    xDoc.Load(PaymentQ, 'Payment')
    
    !- test
    LOOP i=1 TO RECORDS(AccountQ)
      GET(AccountQ, i)
      printd('Account[%i]: IBAN=%s, Owner Name=%s, Owner ID=%s', i, AccountQ.AccId.IBAN, AccountQ.Ownr.Name, AccountQ.Ownr.OwnrId)
    END
    LOOP i=1 TO RECORDS(PaymentQ)
      GET(PaymentQ, i)
      printd('Payment[%i]: OwnrIBAN=%s, Amount=%f', i, PaymentQ.OwnrIBAN, PaymentQ.Amount)
      printd('    Debitor: Id=%s, Name=%s, Account IBAN=%s', i, PaymentQ.Dbtr.DbtrId, PaymentQ.Dbtr.DbtrName, PaymentQ.Dbtr.DbtrAcct.DbtrAcctId.DbtrIBAN)
      printd('   Creditor: Id=%s, Name=%s, Account IBAN=%s', i, PaymentQ.Cdtr.CdtrId, PaymentQ.Cdtr.CdtrName, PaymentQ.Cdtr.CdtrAcct.CdtrAcctId.CdtrIBAN)
    END
  END
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Игорь Столяров писал(а): 14 Февраль 2023, 10:38
finsoftrz писал(а): 14 Февраль 2023, 10:32 Xpath отсутствует в "штатном" парсер, а это принципиально
Это да. Но как я понимаю (я не всегда всё понимаю правильно :D) XPath - это намного больше, чем расширение имён тегов.
А конкретно расширение имён тегов можно отработать через макроподстановки, как и полные длинные имена тегов.
Гипотетически. Думал я. Бу реальная задача - попробую. :)
Гипотетически какой-нибудь костыль, наверно, можно изобрести. Типа предварительно самостоятельно разобрать заголовок xml, определить пространство имён, а затем при переборе в цикле заменять подстроки в тэгах перед проверкой их названий.
Для понимания, в предыдущем примере с xpath, вместо тэга wb:date какой-нибудь программист может написать wb4:date, другой wbe:date и тп, и так по всем тэгам.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

ЭДО

Сообщение SergioRaguzini »

Привет Всем!
Использую парсинг ЕГАИС через xFiles, русские буквы получаю через класс Ю.Философова.
всё работает корректно.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Дед Пахом писал(а): 14 Февраль 2023, 10:53

Код: Выделить всё

  xDoc.Load(AccountQ, 'Account')
Это тот замечательный частный случай, когда тег 'Account' в XML всегда содержит списки для AccountQ и их все нужно загружать.
Конкретно с документами ЭДО (да и большинством реальных задач) - это не прокатит однозначно ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

SergioRaguzini писал(а): 14 Февраль 2023, 11:12 Привет Всем!
Использую парсинг ЕГАИС через xFiles, русские буквы получаю через класс Ю.Философова.
всё работает корректно.
И как с переменными именами тэгов выкручиваешься?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

SergioRaguzini писал(а): 14 Февраль 2023, 11:12 Использую парсинг ЕГАИС через xFiles
Супер ! И как я понимаю на FTP у нас xFiles 3 (со всеми прибамбасами) доступен всем кому он нужен. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить