Страница 2 из 3

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 9:51
Yufil
Admin писал(а): 01 Декабрь 2020, 9:49 Это понял. Только нужно еще encoding="UTF-8" добавить
Пять минут назад выложил фрагмент текста, который это сделает. Только у меня 'WINDOWS-1251' прописные, надо поправить..

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 9:55
Admin
Спасибо

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 10:01
Yufil
Выложил ( без комментариев) несколько фрагментов действующей программы с разборкой XML на https://mega.nz/file/ZphViAAT#o7EcHQ0oQ ... Bz5dwDzLJg
Мож, пригодится

АктСвер 3.01

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

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

2. При разборе XML с "глубокими" вложенными структурами (+ неоправданно длинными наименованиями
тегов, как например в Vetis.API АИС "Меркурий") очень сильно мешает ограничение в 100 символов на
длину имён переменных в Clarion. Вот здесь надо уже выкручиваться с использованием техники Юрия ...

АктСвер 3.01

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

Несколько минут можно и сэкономить. :D

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 14:36
finsoftrz
Пять копеек мои.

Парсить xml принято по уровням. То есть цикл по узлам верхнего уровня, вложенный цикл по узлам следующего уровня и т.д. Так как названия тэгов могут повторяться в разных структурах и сами тэги могут следовать в разном порядке. Верхний узел не обязательно от корня.
В некоторых случаях имена тэгов не фиксированные, и требуется поддержка работы с пространством имен. Например, при работе с алкоголем, каждый юный программер создает свою нетленку и называет тэги, как считает для себя удобным. Может, ошибаюсь, кларина обертка xpath не поддерживает.
Я не так давно смотрел, что из имеющихся инструментов можно взять на вооружение. В том числе и кларину обертку для xml. Но не сложилось, так и оставил работу с xml через vbscript. Из вопросов, долго разбираются большие файлы. Но это не из-за парсера, а при сопоставлении полей в кларионовских структурах. Можно оптимизировать, отказавшись от автомата в сторону большего использования ручного кода. Пока не припекло.

АктСвер 3.01

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

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 15:15
finsoftrz
Цифр точных не скажу. Замечал на Ветисе. Если не принимать документы несколько месяцев, то это может занять несколько минут. Сами знаете, что там структура не простая, с вложенными списковыми реквизитами. Вес xml несколько мегабайт (на память 5-7), справок, по моему, больше тысячи. Я проверял, парсинг происходит достаточно шустро. До получения временного файла с разобранными данными, ну, скажем, полминуты. Остальное засасывание данных в несколько очередей. То есть поиск, в какое поле какое значение засунуть. При желании можно оптимизировать, засунув обработку результата сразу в case структуру, без сохранения в очереди. Но, как правило, файлы с xml не большие и до получения результата все быстро происходит.

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 15:31
RaFaeL
Игорь Столяров писал(а): 01 Декабрь 2020, 11:38 очень сильно мешает ограничение в 100 символов на длину имён переменных в Clarion
А где это написано? У NAME тоже такое есть? Просто не разу не сталкивался, в NAME даже русские пишу и нормально все разбирается

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 15:34
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.

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 16:50
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

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 17:08
Игорь Столяров
RaFaeL писал(а): 01 Декабрь 2020, 15:31 У NAME тоже такое есть ?
Именно для Name() и есть это ограничение. Или Вы думаете я имена переменных по 100 символов пишу ?! ;)

АктСвер 3.01

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

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

АктСвер 3.01

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

В кларионовском парсере реализуется xpath? Это важно.

АктСвер 3.01

Добавлено: 01 Декабрь 2020, 19:54
finsoftrz
Я думал для каких-то задач задействовать стандартный кларионовский парсер. Все же побыстрее должно работать. Посмотрел, понюхал. Супер, спасибо, но нет. Может, нужно несколько подходов к нему сделать, чтобы смириться. :-)