В Clarion 11 может и работает. В Clarion 6 вместо русских тегов символы xxxxxИгорь Столяров писал(а): ↑10 Февраль 2023, 12:22 Штатный XML класс прекрасно считывает и парсит пакет ЭДО c русскими тегами (после конвертации в UTF-8) !
ЭДО
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
ЭДО
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Игорь Столяров
- Ветеран движения
- Сообщения: 7322
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
- Игорь Столяров
- Ветеран движения
- Сообщения: 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
Находим в документе ЭДО содержание и показываем значения тегов и аттрибутов.
Для тех кому интересна технология работы с XML через штатный класс Clarion.
Без левых прибамбасов и проще детской игры в крысу !
Пример см. viewtopic.php?t=4976
Последний раз редактировалось Игорь Столяров 19 Февраль 2023, 12:24, всего редактировалось 2 раза.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4550
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 34 раза
ЭДО
Перебор тегов и атрибутов в цикле, локальные флаги... Не, спасибо. Да и желания копаться в устаревшей библиотеке, которая не поддерживает современные методы работы с xml, совсем нет. Лучше уж easy xml купить, если использование скриптов как стандартный интерфейс к нестандартным для клариона вещам, не устраивает. Там, конечно, тоже смотреть надо, но я, в целом, в Михаила верю. ПыСы. Я когда-то давно пробовал посмотреть код внутри "штатного" парсера xml, мне плохо стало, закрыл, и сделал на скриптах, где все просто и понятно, как капуста.
Если интересно, вот выжимка загрузки накладной в Егаис, используя xpath. Почувствуйте разницу.
Если интересно, вот выжимка загрузки накладной в Егаис, используя 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. Вся работа с ГИС "Меркурий" на этом построена.
Я хотел показать технологическую возможность распарса русских XML с [***] структурой, а не удивить девушку.
А в самом классе конечно есть методы прямого доступа к тегам - пожалуйста юзайте.
Точно также можно загружать списки по полному имени тега как в Вашем примере.
Только напрямую из XML в Group / Queue. Вся работа с ГИС "Меркурий" на этом построена.
Не напарывались ещё на ограничение длины имён переменных в Clarion ? Я - да.finsoftrz писал(а): ↑14 Февраль 2023, 9:47Код: Выделить всё
lor:AdressProizv string(255), name('wb:Product/pref:Producer/oref:UL/oref:address/oref:description')
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4550
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 34 раза
ЭДО
Напарывался, причём именно в Меркурии. Иногда приходится расширять. А что делать? Информацию из xml не только надо прочитать, но ещё и в окне в полях ввода вывести и т.п.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7322
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
ЭДО
Это да. Но как я понимаю (я не всегда всё понимаю правильно ) 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 раза
ЭДО
Гипотетически какой-нибудь костыль, наверно, можно изобрести. Типа предварительно самостоятельно разобрать заголовок xml, определить пространство имён, а затем при переборе в цикле заменять подстроки в тэгах перед проверкой их названий.Игорь Столяров писал(а): ↑14 Февраль 2023, 10:38Это да. Но как я понимаю (я не всегда всё понимаю правильно ) XPath - это намного больше, чем расширение имён тегов.
А конкретно расширение имён тегов можно отработать через макроподстановки, как и полные длинные имена тегов.
Гипотетически. Думал я. Бу реальная задача - попробую.
Для понимания, в предыдущем примере с xpath, вместо тэга wb:date какой-нибудь программист может написать wb4:date, другой wbe:date и тп, и так по всем тэгам.
C6/C11, ШВС, tps/btrieve.
- SergioRaguzini
- Старожил
- Сообщения: 233
- Зарегистрирован: 08 Декабрь 2009, 19:16
- Откуда: Краснодарский край
- Благодарил (а): 6 раз
ЭДО
Привет Всем!
Использую парсинг ЕГАИС через xFiles, русские буквы получаю через класс Ю.Философова.
всё работает корректно.
Использую парсинг ЕГАИС через xFiles, русские буквы получаю через класс Ю.Философова.
всё работает корректно.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7322
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
ЭДО
Это тот замечательный частный случай, когда тег 'Account' в XML всегда содержит списки для AccountQ и их все нужно загружать.
Конкретно с документами ЭДО (да и большинством реальных задач) - это не прокатит однозначно ...
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4550
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 34 раза
ЭДО
И как с переменными именами тэгов выкручиваешься?SergioRaguzini писал(а): ↑14 Февраль 2023, 11:12 Привет Всем!
Использую парсинг ЕГАИС через xFiles, русские буквы получаю через класс Ю.Философова.
всё работает корректно.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7322
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
ЭДО
Супер ! И как я понимаю на FTP у нас xFiles 3 (со всеми прибамбасами) доступен всем кому он нужен.
За теми кто отстал - не возвращаться. (С) Кодекс