Страница 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
				Я думал для каких-то задач задействовать стандартный кларионовский парсер. Все же побыстрее должно работать. Посмотрел, понюхал. Супер, спасибо, но нет. Может, нужно несколько подходов к нему сделать, чтобы смириться. 
