Пять минут назад выложил фрагмент текста, который это сделает. Только у меня 'WINDOWS-1251' прописные, надо поправить..
АктСвер 3.01 (Чтение XML)
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
АктСвер 3.01
АктСвер 3.01
Выложил ( без комментариев) несколько фрагментов действующей программы с разборкой XML на https://mega.nz/file/ZphViAAT#o7EcHQ0oQ ... Bz5dwDzLJg
Мож, пригодится
			
			
									
						Мож, пригодится
- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
АктСвер 3.01
Тоже добавлю пару строк, которые помогут избежать изобретения велосипеда
(и временных затрат на это) при работе с парсером XML Clarion:
1. Если в структуре XML документа нет вложенных циклических тегов (например как в списке
накладных - список содержания), то ВСЕГДА можно правильно описать имена полей в QUEUE
и загрузить в неё XML одной командой без всякого распарса. Эх, если бы только не п. 2 ...
2. При разборе XML с "глубокими" вложенными структурами (+ неоправданно длинными наименованиями
тегов, как например в Vetis.API АИС "Меркурий") очень сильно мешает ограничение в 100 символов на
длину имён переменных в Clarion. Вот здесь надо уже выкручиваться с использованием техники Юрия ...
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						АктСвер 3.01
Можно дописать ещё парочку функций:
- автоматическое копирование параметров текущей ветки в поля заданной группы ( или очереди ) с возможностью явно указывать соответствие
наименование параметра -> имя поля в группе.
- то же самое для очереди, чтобы сразу выполнить цикл заполнения.
Несколько минут можно и сэкономить.
			
			
									
						- автоматическое копирование параметров текущей ветки в поля заданной группы ( или очереди ) с возможностью явно указывать соответствие
наименование параметра -> имя поля в группе.
- то же самое для очереди, чтобы сразу выполнить цикл заполнения.
Несколько минут можно и сэкономить.
- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5567
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
АктСвер 3.01
Пять копеек мои.
Парсить xml принято по уровням. То есть цикл по узлам верхнего уровня, вложенный цикл по узлам следующего уровня и т.д. Так как названия тэгов могут повторяться в разных структурах и сами тэги могут следовать в разном порядке. Верхний узел не обязательно от корня.
В некоторых случаях имена тэгов не фиксированные, и требуется поддержка работы с пространством имен. Например, при работе с алкоголем, каждый юный программер создает свою нетленку и называет тэги, как считает для себя удобным. Может, ошибаюсь, кларина обертка xpath не поддерживает.
Я не так давно смотрел, что из имеющихся инструментов можно взять на вооружение. В том числе и кларину обертку для xml. Но не сложилось, так и оставил работу с xml через vbscript. Из вопросов, долго разбираются большие файлы. Но это не из-за парсера, а при сопоставлении полей в кларионовских структурах. Можно оптимизировать, отказавшись от автомата в сторону большего использования ручного кода. Пока не припекло.
			
			
									
						Парсить xml принято по уровням. То есть цикл по узлам верхнего уровня, вложенный цикл по узлам следующего уровня и т.д. Так как названия тэгов могут повторяться в разных структурах и сами тэги могут следовать в разном порядке. Верхний узел не обязательно от корня.
В некоторых случаях имена тэгов не фиксированные, и требуется поддержка работы с пространством имен. Например, при работе с алкоголем, каждый юный программер создает свою нетленку и называет тэги, как считает для себя удобным. Может, ошибаюсь, кларина обертка xpath не поддерживает.
Я не так давно смотрел, что из имеющихся инструментов можно взять на вооружение. В том числе и кларину обертку для xml. Но не сложилось, так и оставил работу с xml через vbscript. Из вопросов, долго разбираются большие файлы. Но это не из-за парсера, а при сопоставлении полей в кларионовских структурах. Можно оптимизировать, отказавшись от автомата в сторону большего использования ручного кода. Пока не припекло.
C6/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
АктСвер 3.01
Ну таки не знаю ... что значит большие и что значит долго ? Назовите Ваши цифры !
Например текущий справочник БИК (сейчас с ЦБ идёт в XML) - 1295 записей, распарсивается за 2-3 сек.
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5567
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
АктСвер 3.01
Цифр точных не скажу. Замечал на Ветисе. Если не принимать документы несколько месяцев, то это может занять несколько минут. Сами знаете, что там структура не простая, с вложенными списковыми реквизитами. Вес xml несколько мегабайт (на память 5-7), справок, по моему, больше тысячи. Я проверял, парсинг происходит достаточно шустро. До получения временного файла с разобранными данными, ну, скажем, полминуты. Остальное засасывание данных в несколько очередей. То есть поиск, в какое поле какое значение засунуть. При желании можно оптимизировать, засунув обработку результата сразу в case структуру, без сохранения в очереди. Но, как правило, файлы с xml не большие и до получения результата все быстро происходит.
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						- RaFaeL
 - ✯ Ветеран ✯
 - Сообщения: 1417
 - Зарегистрирован: 24 Март 2009, 17:59
 - Откуда: НН
 - Благодарил (а): 12 раз
 - Поблагодарили: 2 раза
 - Контактная информация:
 
АктСвер 3.01
А где это написано? У NAME тоже такое есть? Просто не разу не сталкивался, в NAME даже русские пишу и нормально все разбираетсяИгорь Столяров писал(а): 01 Декабрь 2020, 11:38 очень сильно мешает ограничение в 100 символов на длину имён переменных в Clarion
АктСвер 3.01
Кларина обёртка обеспечивает гораздо более низкоуровневый доступ, причём как DOM ( загрузка всей структуры), так и SAX ( прохождение по узлам дерева ). Но я искал максимально простой вариант для себя. Показалось, что ViewXML / FillDomQueue наиболее просто. 
Процедура FillDomQueue преобразует дерево DOM в очередь Клариона, с очередью все могут достаточно комфортно работать.
<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.
			
			
									
						Процедура 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
 - ✯ Ветеран ✯
 - Сообщения: 5567
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
АктСвер 3.01
Это понятно. Но хотелось бы избежать такого подхода со специальными флажковыми переменными.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 = NothingC6/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
АктСвер 3.01
Именно для Name() и есть это ограничение. Или Вы думаете я имена переменных по 100 символов пишу ?!
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						АктСвер 3.01
Это понятно. Но хотелось бы избежать такого подхода со специальными флажковыми переменными.
Например, код на vbscript выглядит так. Просто, понятно.
Ну, батенька, это же не Кларион! Я в Питоне ещё красивше могу...
И в Кларионе я могу дописать ещё несколько методов, реализующих такие операции. Или воспользуюсь ещё кучкой методов, реализованных в Clarion API ( там процентов 99 за кадром ).
Задачу в Кларионе решает? Ага... Даже в UTF-8? Угу... И с ветвистой структурой данных? А то..
Супер
			
			
									
						Например, код на vbscript выглядит так. Просто, понятно.
Ну, батенька, это же не Кларион! Я в Питоне ещё красивше могу...
И в Кларионе я могу дописать ещё несколько методов, реализующих такие операции. Или воспользуюсь ещё кучкой методов, реализованных в Clarion API ( там процентов 99 за кадром ).
Задачу в Кларионе решает? Ага... Даже в UTF-8? Угу... И с ветвистой структурой данных? А то..
Супер
- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5567
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
АктСвер 3.01
В кларионе точно такой-же код в виде параметра метода класса. Это в сложных случаях, в типовых все это за кадром, автоматом генерится. Типа, загрузи мне в кьшку из узла такого-то. Одним вызовом, и все. 
Мне важно, что не надо разбираться с кларионовской надстройкой. Смотрел, там сложно на мое восприятие написано, и никаких комментариев. Если нужно что-то этакое и быстро, ищем в интернете пример на vbscript, вставляем себе в программу на кларионе и заводим. Экономится куча времени, и нет сюрпризов.
В кларионовском парсере реализуется xpath? Это важно.
			
			
									
						Мне важно, что не надо разбираться с кларионовской надстройкой. Смотрел, там сложно на мое восприятие написано, и никаких комментариев. Если нужно что-то этакое и быстро, ищем в интернете пример на vbscript, вставляем себе в программу на кларионе и заводим. Экономится куча времени, и нет сюрпризов.
В кларионовском парсере реализуется xpath? Это важно.
C6/C12, ШВС, tps/btrieve.
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5567
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
АктСвер 3.01
Я думал для каких-то задач задействовать стандартный кларионовский парсер. Все же побыстрее должно работать. Посмотрел, понюхал. Супер, спасибо, но нет. Может, нужно несколько подходов к нему сделать, чтобы смириться. 
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						