Страница 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
Можно дописать ещё парочку функций:
- автоматическое копирование параметров текущей ветки в поля заданной группы ( или очереди ) с возможностью явно указывать соответствие
наименование параметра -> имя поля в группе.
- то же самое для очереди, чтобы сразу выполнить цикл заполнения.
Несколько минут можно и сэкономить.
АктСвер 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? Угу... И с ветвистой структурой данных? А то..
Супер
АктСвер 3.01
Добавлено: 01 Декабрь 2020, 19:49
finsoftrz
В кларионе точно такой-же код в виде параметра метода класса. Это в сложных случаях, в типовых все это за кадром, автоматом генерится. Типа, загрузи мне в кьшку из узла такого-то. Одним вызовом, и все.
Мне важно, что не надо разбираться с кларионовской надстройкой. Смотрел, там сложно на мое восприятие написано, и никаких комментариев. Если нужно что-то этакое и быстро, ищем в интернете пример на vbscript, вставляем себе в программу на кларионе и заводим. Экономится куча времени, и нет сюрпризов.
В кларионовском парсере реализуется xpath? Это важно.
АктСвер 3.01
Добавлено: 01 Декабрь 2020, 19:54
finsoftrz
Я думал для каких-то задач задействовать стандартный кларионовский парсер. Все же побыстрее должно работать. Посмотрел, понюхал. Супер, спасибо, но нет. Может, нужно несколько подходов к нему сделать, чтобы смириться.