АктСвер 3.01 (Чтение XML)

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

АктСвер 3.01

Сообщение Yufil »

Admin писал(а): 01 Декабрь 2020, 9:49 Это понял. Только нужно еще encoding="UTF-8" добавить
Пять минут назад выложил фрагмент текста, который это сделает. Только у меня 'WINDOWS-1251' прописные, надо поправить..
Аватара пользователя
Admin
Администратор
Сообщения: 3642
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

АктСвер 3.01

Сообщение Admin »

Спасибо
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

АктСвер 3.01

Сообщение Yufil »

Выложил ( без комментариев) несколько фрагментов действующей программы с разборкой XML на https://mega.nz/file/ZphViAAT#o7EcHQ0oQ ... Bz5dwDzLJg
Мож, пригодится
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5084
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

АктСвер 3.01

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

Yufil писал(а): 01 Декабрь 2020, 10:01Мож, пригодится
Тоже добавлю пару строк, которые помогут избежать изобретения велосипеда
(и временных затрат на это) при работе с парсером XML Clarion:

1. Если в структуре XML документа нет вложенных циклических тегов (например как в списке
накладных - список содержания), то ВСЕГДА можно правильно описать имена полей в QUEUE
и загрузить в неё XML одной командой без всякого распарса. Эх, если бы только не п. 2 ... :(

2. При разборе XML с "глубокими" вложенными структурами (+ неоправданно длинными наименованиями
тегов, как например в Vetis.API АИС "Меркурий") очень сильно мешает ограничение в 100 символов на
длину имён переменных в Clarion. Вот здесь надо уже выкручиваться с использованием техники Юрия ...
«V» значит Вендетта !
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

АктСвер 3.01

Сообщение Yufil »

Можно дописать ещё парочку функций:
- автоматическое копирование параметров текущей ветки в поля заданной группы ( или очереди ) с возможностью явно указывать соответствие
наименование параметра -> имя поля в группе.
- то же самое для очереди, чтобы сразу выполнить цикл заполнения.

Несколько минут можно и сэкономить. :D
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2424
Зарегистрирован: 06 Ноябрь 2014, 12:48

АктСвер 3.01

Сообщение finsoftrz »

Пять копеек мои.

Парсить xml принято по уровням. То есть цикл по узлам верхнего уровня, вложенный цикл по узлам следующего уровня и т.д. Так как названия тэгов могут повторяться в разных структурах и сами тэги могут следовать в разном порядке. Верхний узел не обязательно от корня.
В некоторых случаях имена тэгов не фиксированные, и требуется поддержка работы с пространством имен. Например, при работе с алкоголем, каждый юный программер создает свою нетленку и называет тэги, как считает для себя удобным. Может, ошибаюсь, кларина обертка xpath не поддерживает.
Я не так давно смотрел, что из имеющихся инструментов можно взять на вооружение. В том числе и кларину обертку для xml. Но не сложилось, так и оставил работу с xml через vbscript. Из вопросов, долго разбираются большие файлы. Но это не из-за парсера, а при сопоставлении полей в кларионовских структурах. Можно оптимизировать, отказавшись от автомата в сторону большего использования ручного кода. Пока не припекло.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5084
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

АктСвер 3.01

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

finsoftrz писал(а): 01 Декабрь 2020, 14:36 Из вопросов, долго разбираются большие файлы
Ну таки не знаю ... что значит большие и что значит долго ? Назовите Ваши цифры ! :)
Например текущий справочник БИК (сейчас с ЦБ идёт в XML) - 1295 записей, распарсивается за 2-3 сек.
«V» значит Вендетта !
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2424
Зарегистрирован: 06 Ноябрь 2014, 12:48

АктСвер 3.01

Сообщение finsoftrz »

Цифр точных не скажу. Замечал на Ветисе. Если не принимать документы несколько месяцев, то это может занять несколько минут. Сами знаете, что там структура не простая, с вложенными списковыми реквизитами. Вес xml несколько мегабайт (на память 5-7), справок, по моему, больше тысячи. Я проверял, парсинг происходит достаточно шустро. До получения временного файла с разобранными данными, ну, скажем, полминуты. Остальное засасывание данных в несколько очередей. То есть поиск, в какое поле какое значение засунуть. При желании можно оптимизировать, засунув обработку результата сразу в case структуру, без сохранения в очереди. Но, как правило, файлы с xml не большие и до получения результата все быстро происходит.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1130
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

АктСвер 3.01

Сообщение RaFaeL »

Игорь Столяров писал(а): 01 Декабрь 2020, 11:38 очень сильно мешает ограничение в 100 символов на длину имён переменных в Clarion
А где это написано? У NAME тоже такое есть? Просто не разу не сталкивался, в NAME даже русские пишу и нормально все разбирается
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

АктСвер 3.01

Сообщение Yufil »

Кларина обёртка обеспечивает гораздо более низкоуровневый доступ, причём как DOM ( загрузка всей структуры), так и SAX ( прохождение по узлам дерева ). Но я искал максимально простой вариант для себя. Показалось, что ViewXML / FillDomQueue наиболее просто.

Процедура FillDomQueue преобразует дерево DOM в очередь Клариона, с очередью все могут достаточно комфортно работать.
finsoftrz писал(а): 01 Декабрь 2020, 14:36 Парсить xml принято по уровням. То есть цикл по узлам верхнего уровня, вложенный цикл по узлам следующего уровня и т.д. Так как названия тэгов могут повторяться в разных структурах и сами тэги могут следовать в разном порядке. Верхний узел не обязательно от корня.
Это несложно, при прохождении тэга можно установить статус. Например,
<apple> <param weight="123"/></apple>
<lemon> <param weight="123"/></lemon>


При считывании очереди будут проанализированы тэги 'apple', '/apple', 'lemon','/lemon'. Появление тэга устанавливает статус, определяющий обработку поля 'param' .

Я сейчас пишу на Python в основном, там сейчас есть класс xmltodict https://omz-software.com/pythonista/doc ... odict.html, он просто преобразует xml в словарь, содержащий древовидную структуру XML, а дальше можно как угодно гулять по ней и собирать данные. Очень просто и удобно, гораздо удобнее чем python DOM/Sax parser или elementtree.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2424
Зарегистрирован: 06 Ноябрь 2014, 12:48

АктСвер 3.01

Сообщение finsoftrz »

Yufil писал(а): 01 Декабрь 2020, 15:34
finsoftrz писал(а): 01 Декабрь 2020, 14:36 Парсить xml принято по уровням. То есть цикл по узлам верхнего уровня, вложенный цикл по узлам следующего уровня и т.д. Так как названия тэгов могут повторяться в разных структурах и сами тэги могут следовать в разном порядке. Верхний узел не обязательно от корня.
Это несложно, при прохождении тэга можно установить статус. Например,
<apple> <param weight="123"/></apple>
<lemon> <param weight="123"/></lemon>


При считывании очереди будут проанализированы тэги 'apple', '/apple', 'lemon','/lemon'. Появление тэга устанавливает статус, определяющий обработку поля 'param' .
Это понятно. Но хотелось бы избежать такого подхода со специальными флажковыми переменными.
Например, код на vbscript выглядит так. Просто, понятно.

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

Set NodeList = Root.getElementsByTagName("СведТов")
For Each Elem In NodeList
   tovname = Elem.getAttribute("НаимТов")
   tovkol = Elem.getAttribute("КолТов")
   tovsum = Elem.getAttribute("СтТовУчНал")
   SET per = Elem.getElementsByTagName("ДопСведТов/НомСредИдентТов/НомУпак")(0)
   if not per is Nothing then
      tovshtrih = per.text
   else
      tovshtrih = ""
   end if
   Set NodeList2 = Elem.getElementsByTagName("ИнфПолФХЖ2")
   For Each Elem2 In NodeList2
      ident = Elem2.getAttribute("Идентиф")
   Next
Next
Set NodeList = Nothing
Set NodeList2 = Nothing
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5084
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

АктСвер 3.01

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

RaFaeL писал(а): 01 Декабрь 2020, 15:31 У NAME тоже такое есть ?
Именно для Name() и есть это ограничение. Или Вы думаете я имена переменных по 100 символов пишу ?! ;)
«V» значит Вендетта !
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

АктСвер 3.01

Сообщение Yufil »

Это понятно. Но хотелось бы избежать такого подхода со специальными флажковыми переменными.
Например, код на vbscript выглядит так. Просто, понятно.

Ну, батенька, это же не Кларион! Я в Питоне ещё красивше могу...
И в Кларионе я могу дописать ещё несколько методов, реализующих такие операции. Или воспользуюсь ещё кучкой методов, реализованных в Clarion API ( там процентов 99 за кадром ).
Задачу в Кларионе решает? Ага... Даже в UTF-8? Угу... И с ветвистой структурой данных? А то..
Супер :D
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2424
Зарегистрирован: 06 Ноябрь 2014, 12:48

АктСвер 3.01

Сообщение finsoftrz »

В кларионе точно такой-же код в виде параметра метода класса. Это в сложных случаях, в типовых все это за кадром, автоматом генерится. Типа, загрузи мне в кьшку из узла такого-то. Одним вызовом, и все.
Мне важно, что не надо разбираться с кларионовской надстройкой. Смотрел, там сложно на мое восприятие написано, и никаких комментариев. Если нужно что-то этакое и быстро, ищем в интернете пример на vbscript, вставляем себе в программу на кларионе и заводим. Экономится куча времени, и нет сюрпризов.

В кларионовском парсере реализуется xpath? Это важно.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2424
Зарегистрирован: 06 Ноябрь 2014, 12:48

АктСвер 3.01

Сообщение finsoftrz »

Я думал для каких-то задач задействовать стандартный кларионовский парсер. Все же побыстрее должно работать. Посмотрел, понюхал. Супер, спасибо, но нет. Может, нужно несколько подходов к нему сделать, чтобы смириться. :-)
C6/C11, ШВС, tps/btrieve.
Ответить