Страница 3 из 5
					
				Класс для API XML «На основе штатного CpXML»
				Добавлено: 19 Февраль 2023, 10:25
				 Игорь Столяров
				Привет всем !
В контексте существующих задач для работы с XML, сделал простой интерфейс (даже не субкласс !).
Используются только штатные компоненты Clarion и WinAPI без зависимостей и самостийных улучшений.
Проект полный OpenSource & FreeWare навсегда. 
Принцип работы парсера ToyXML до неприличия простой:
-------------------------------------------------------------------------
Задаём в описании GROUP / QUEUE структуру XML файла (или его фрагмента) и загружаем
одной командой начиная с указанного тега. Всё. И это полное описание работы парсера. 
Сейчас реализован функционал:
-----------------------------------------
- Загрузка XML в кодировке Windows-1251 / UTF-8;
- Загрузка произвольных списков с файлами (в кодировке BASE64);
- Загрузка данных из тегов с повторяющимися именами в разных группах / уровнях;
- Загрузка значений тега в связанный список (пока один, но заложено без ограничений);
- Методы загрузки списков с индикацией процесса выполнения;
- Запись XML пакетов показана в примере.
В качестве примера показан парс документа ЭДО:
- Получаем одной командой в GROUP собственно сам документ (это около 500 полей);
- Получаем список содержания, с вложенным списком кодов ОСУ, для каждой строки содержания;
С благодарностью, использованы идеи и код Yufil (Юрия Философова).
 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 03 Март 2023, 10:08
				 Игорь Столяров
				В первом сообщении сабж обновлён до версии 03.03.2023 г.
-----------------------------------------------------------------------------
- Убран старый рудиментный код (стало светлее);
- Скорость парса увеличена в разы за счёт построения таблицы полных имён полей структуры;
- Добавлен режим отладки для подсветки ошибок данных и работы парсера. Не ускоряет работу. 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 06 Март 2023, 18:24
				 Игорь Столяров
				В первом сообщении сабж обновлён до версии 06.03.2023 г.
-----------------------------------------------------------------------------
- Снято ограничение на кол-во дочерних списков в методе ToQueue;
- Добавлено правило 'IsList' для привязки дочерних списков;
- Упрощена внутренняя структура данных и методов класса.
Вообще, где-то в этом месте пришло понимание, что можно попробовать сделать
парсер основанный на рекурсивном раскручивании XML по структуре данных.
Но это уже на какой-нибудь в другой задаче и может быть не я. 
P/S: Спасибо всем кто не поленился пнуть и прислать примеры документов ЭДО. 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 09 Март 2023, 6:59
				 Игорь Столяров
				В первом сообщении сабж обновлён до версии 09.03.2023 г.
-----------------------------------------------------------------------------
- Добавлена настройка разделителя полей и тегов;
- Увеличена на порядок скорость создания списка полных имён полей структуры данных
(рекурсивный разбор полей GROUP за один проход).
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 8:11
				 Игорь Столяров
				В первом сообщении сабж обновлён до версии 14.03.2023 г.
-----------------------------------------------------------------------------
Добавлены методы:
- SpecifiedTag() - проверка присутствия тега/атрибута в XML пакете;
- ValueByName() - получить значение поля по полному имени в структуре данных;
- ValueByGroup() - получить значение поля по имени из группы в структуре данных.
Использование новых методов продемонстрировано в примере загрузки пакета ЭДО.
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 9:26
				 finsoftrz
				
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 11:05
				 Игорь Столяров
				Ага, что-то вроде того и получается. 

Практическое применение новые методов - это получение данных контрагентов из пакета ЭДО.
Они однотипны - но находятся на разных уровнях. Например - грузокоординаты.
Код: Выделить всё
       xTag         &EDO::G_UchasTip
...
       Execute bVid
         xTag &= Loc:EDO.File.Document.SvSchFact.GruzPol          ! 1 = Грузополучатель  (свои реквизиты)
         xTag &= Loc:EDO.File.Document.SvSchFact.GruzOt.GruzOtpr  ! 2 = Грузоотправитель (поставщик)
       end
Также есть разница, отсутствует какой-либо необязательный показатель в пакете или у него нулевое значение. 
И т.д. если эта тема Вам интересна. 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 12:22
				 finsoftrz
				Если про меня, то мне не интересно. Картинку прикольную прислали, показалось, что хорошо в тему вписывается. 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 12:54
				 Игорь Столяров
				Безусловно, очень интересная картинка. 
Спасибо, что находите возможность поддержать обсуждение ! 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 14:02
				 finsoftrz
				Обращайтесь.  

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 14 Март 2023, 14:29
				 Игорь Столяров
				Сами приходите - у нас политика открытых дверей. 

(С) NATO
 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 17 Март 2023, 21:36
				 Игорь Столяров
				Было обсуждение, как добыть из пакета ЭДО штрих-код товара.
Если не брать во внимание экзотику пельменных цехов, то есть 3 (три) варианта,
где укротитель 1С может спрятать штрих-код в содержании пакета ЭДО:
Код: Выделить всё
Loc:SCod CString(15)
Code
 ... 
  ! 1. Код ОСУ маркированного товара
  If (Sub(Loc:QTab.SvedTov.AddInfoGoods.NumIdGoods.NumberPack,01,02) = '02') and |
     (Sub(Loc:QTab.SvedTov.AddInfoGoods.NumIdGoods.NumberPack,17,02) = '37') and |
     Numeric(Sub(Loc:QTab.SvedTov.AddInfoGoods.NumIdGoods.NumberPack,03,14))
     Loc:SCod = Sub(Loc:QTab.SvedTov.AddInfoGoods.NumIdGoods.NumberPack,03,14)
  end
  ! 2. Код товара
  If Loc:SCod = '' and Loc:QTab.SvedTov.AddInfoGoods.CodTov <> '' and Numeric(Loc:QTab.SvedTov.AddInfoGoods.CodTov)
     Loc:SCod = Loc:QTab.SvedTov.AddInfoGoods.CodTov
  end
  ! 3. GTIN
  If Loc:SCod = '' and Records(Loc:QInfo2) > 0
     Clear(Loc:QInfo2)
     Loc:QInfo2.TextInf.NumRow = Loc:QTab.SvedTov.NumRow
     Get(Loc:QInfo2,Loc:QInfo2.TextInf.NumRow)
     If ~ErrorCode() and (Upper(Loc:QInfo2.TextInf.Id) = 'GTIN') and (Loc:QInfo2.TextInf.Value <> '') and |
        Numeric(Loc:QInfo2.TextInf.Value)
        Loc:SCod = Loc:QInfo2.TextInf.Value
     end
  end
  
  Message('Штрих-код: ' & Loc:SCod)
Вроде бы (!) работает везде ... 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 23 Март 2023, 7:49
				 Admin
				Тот же test.xml в кодировке utf-8 не смог загрузить:
ошибка при загрузке и все тут.
Далее пробовал свой XML загрузить. У меня в некоторых поля используется CHR(19) по типу
Код: Выделить всё
<ADDITIONALINFO>Документ создан на основе заказа @1856867 от 16@04601@0462023</ADDITIONALINFO>
Где @ = CHR(19)
Тоже не грузит. Я так понимаю функции XMLStringToDOM голову сносит
 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 23 Март 2023, 7:55
				 Игорь Столяров
				Admin писал(а): 23 Март 2023, 7:49
Тот же test.xml в кодировке utf-8 не смог загрузить
 
Потому, что загрузка из XML файла в UTF-8 файла выполняется как:
см. значения первого параметра xVid_ в методе Init класса ToyXML:
Код: Выделить всё
! Создать новый объект
ToyXML.Init          Procedure(byte xVid_,*? xStr_,UShort xProgress_ = 0)  !,Byte,Proc
  Code
  Self.Kill  ! Убрать предыдущий объект
  Execute xVid_                                                 ! <-- Тип данных
    Self.XmlDoc &= XMLStringToDOM(TXM::LoadStrFromFile(xStr_))  ! 1. Файл   UTF-8
    Self.XmlDoc &= XMLStringToDOM(                     xStr_ )  ! 2. Строка UTF-8
    Self.XmlDoc &= XMLStringToDOM(TXM::XmlFileToStrUTF(xStr_))  ! 3. Файл   ANSI
    Self.XmlDoc &= XMLStringToDOM(TXM::StrAnsiToUTF(   xStr_))  ! 4. Строка ANSI
  end
Ну или проблемный XML файл в студию ... 

 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 23 Март 2023, 8:19
				 Игорь Столяров
				Admin писал(а): 23 Март 2023, 7:49
У меня в некоторых поля используется CHR(19) по типу
 
Попробовал несколько парсеров - так делать нельзя.
Здесь должно использоваться экранирование спецсимвола в строке.
 
			 
			
					
				Класс tXML (интерфейс для штатного CpXML)
				Добавлено: 24 Март 2023, 6:44
				 Admin
				Спасибо. Со всем разобрался уже. Отличная работа!