Класс tXML (интерфейс для штатного CpXML)

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

В первом сообщении сабж обновлён до версии 03.03.2023 г.
-----------------------------------------------------------------------------
- Убран старый рудиментный код (стало светлее);
- Скорость парса увеличена в разы за счёт построения таблицы полных имён полей структуры;
- Добавлен режим отладки для подсветки ошибок данных и работы парсера. Не ускоряет работу. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

В первом сообщении сабж обновлён до версии 06.03.2023 г.
-----------------------------------------------------------------------------
- Снято ограничение на кол-во дочерних списков в методе ToQueue;
- Добавлено правило 'IsList' для привязки дочерних списков;
- Упрощена внутренняя структура данных и методов класса.

Вообще, где-то в этом месте пришло понимание, что можно попробовать сделать
парсер основанный на рекурсивном раскручивании XML по структуре данных.
Но это уже на какой-нибудь в другой задаче и может быть не я. :)

P/S: Спасибо всем кто не поленился пнуть и прислать примеры документов ЭДО. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

В первом сообщении сабж обновлён до версии 09.03.2023 г.
-----------------------------------------------------------------------------
- Добавлена настройка разделителя полей и тегов;
- Увеличена на порядок скорость создания списка полных имён полей структуры данных
(рекурсивный разбор полей GROUP за один проход).
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

В первом сообщении сабж обновлён до версии 14.03.2023 г.
-----------------------------------------------------------------------------
Добавлены методы:
- SpecifiedTag() - проверка присутствия тега/атрибута в XML пакете;
- ValueByName() - получить значение поля по полному имени в структуре данных;
- ValueByGroup() - получить значение поля по имени из группы в структуре данных.

Использование новых методов продемонстрировано в примере загрузки пакета ЭДО.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4561
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Класс tXML (интерфейс для штатного CpXML)

Сообщение finsoftrz »

clip1678770374.png
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

Ага, что-то вроде того и получается. :)
Практическое применение новые методов - это получение данных контрагентов из пакета ЭДО.
Они однотипны - но находятся на разных уровнях. Например - грузокоординаты.

Код: Выделить всё

       xTag         &EDO::G_UchasTip
...
       Execute bVid
         xTag &= Loc:EDO.File.Document.SvSchFact.GruzPol          ! 1 = Грузополучатель  (свои реквизиты)
         xTag &= Loc:EDO.File.Document.SvSchFact.GruzOt.GruzOtpr  ! 2 = Грузоотправитель (поставщик)
       end
Также есть разница, отсутствует какой-либо необязательный показатель в пакете или у него нулевое значение.
И т.д. если эта тема Вам интересна. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4561
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Класс tXML (интерфейс для штатного CpXML)

Сообщение finsoftrz »

Если про меня, то мне не интересно. Картинку прикольную прислали, показалось, что хорошо в тему вписывается. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

Безусловно, очень интересная картинка.
Спасибо, что находите возможность поддержать обсуждение ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4561
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Класс tXML (интерфейс для штатного CpXML)

Сообщение finsoftrz »

Обращайтесь. :D
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

Сами приходите - у нас политика открытых дверей. ;)
(С) NATO
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

Было обсуждение, как добыть из пакета ЭДО штрих-код товара.
Если не брать во внимание экзотику пельменных цехов, то есть 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)
Вроде бы (!) работает везде ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Класс tXML (интерфейс для штатного CpXML)

Сообщение Admin »

Тот же test.xml в кодировке utf-8 не смог загрузить:

Код: Выделить всё

Loc:MyXML.Init(2,Loc:FileXML)
ошибка при загрузке и все тут.

Далее пробовал свой XML загрузить. У меня в некоторых поля используется CHR(19) по типу

Код: Выделить всё

<ADDITIONALINFO>Документ создан на основе заказа @1856867 от 16@04601@0462023</ADDITIONALINFO>
Где @ = CHR(19)
Тоже не грузит. Я так понимаю функции XMLStringToDOM голову сносит
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

Admin писал(а): 23 Март 2023, 7:49 Тот же test.xml в кодировке utf-8 не смог загрузить
Потому, что загрузка из XML файла в UTF-8 файла выполняется как:

Код: Выделить всё

  Loc:MyXML.Init(1,Loc:FileXML)
см. значения первого параметра 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 файл в студию ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Класс tXML (интерфейс для штатного CpXML)

Сообщение Игорь Столяров »

Admin писал(а): 23 Март 2023, 7:49 У меня в некоторых поля используется CHR(19) по типу
Попробовал несколько парсеров - так делать нельзя.
Здесь должно использоваться экранирование спецсимвола в строке.

1.jpg
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Класс tXML (интерфейс для штатного CpXML)

Сообщение Admin »

Спасибо. Со всем разобрался уже. Отличная работа!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить