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

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

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

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

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

Сообщение Admin »

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

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

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

Admin писал(а): 24 Март 2023, 7:44 Простой EXE на С6.3 ABC падает при попытке обращения к классу
Дежавю ... ;)

Проверьте пожалуйста, что бы у Вас в проекте DLL были определены
опции самого CpXML (аналогично примеру):

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

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

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

Сообщение Admin »

Игорь Столяров писал(а): 24 Март 2023, 8:20Дежавю
Действительно, туплю...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Вот вариант:

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

...
<СведТов НомСтр="4" НаимТов="Стиральная машина LG F2T3HS6W кл.:A фронт. макс.:7кг белый " ОКЕИ_Тов="796" КолТов="10.00" ЦенаТов="41076.67" СтТовБезНДС="410766.67" НалСт="20%" СтТовУчНал="492920.00">
  <Акциз>                                                                                                                                                                                             
    <БезАкциз>без акциза</БезАкциз>                                                                                                                                                                   
  </Акциз>                                                                                                                                                                                            
  <СумНал>                                                                                                                                                                                            
    <СумНал>82153.33</СумНал>                                                                                                                                                                         
  </СумНал>                                                                                                                                                                                           
  <СвТД КодПроисх="156" НомерТД="Прослеж" />                                                                                                                                                          
  <СвТД КодПроисх="643" НомерТД="Прослеж" />                                                                                                                                                          
  <ДопСведТов КодТов="1862190" НаимЕдИзм="шт" КрНаимСтрПр="Китай" НадлОтп="0.00">                                                                                                                     
    <СведПрослеж НомТовПрослеж="99995038/141122/0000284/001" ЕдИзмПрослеж="796" КолВЕдПрослеж="7.00" НаимЕдИзмПрослеж="шт" />                                                                         
    <СведПрослеж НомТовПрослеж="99995038/011122/0000382/001" ЕдИзмПрослеж="796" КолВЕдПрослеж="3.00" НаимЕдИзмПрослеж="шт" />                                                                         
  </ДопСведТов>                                                                                                                                                                                       
  <ИнфПолФХЖ2 Идентиф="рег_номер_таможенной_декларации_расшифровка" Значен="99995038/011122/0000382/001_3" />                                                                                         
  <ИнфПолФХЖ2 Идентиф="рег_номер_таможенной_декларации_расшифровка" Значен="99995038/141122/0000284/001_7" />                                                                                         
</СведТов>                                                                                                                                                                                            
...
Как для этого товара получить две строки СвТД и ДопСведТов в очереди?
Не понимаю, что мешало СвТД вложить в какой либо тег.
XML добавляю на всякий случай.
xml.zip
(2.47 КБ) 61 скачивание
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

СвТД загрузил по аналогии с ИнфПолФХЖ2
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7314
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

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

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

В первом сообщении сабж обновлён до версии 30.03.2023 г.
-----------------------------------------------------------------------------
- Устранены мелкие проблемы с парсингом связанных списов;
- Добавлен класс PushXML - запись XML пакетов (см. пример).

Есть много способов красиво и правильно записать XML пакет (например класс Capesoft xFiles).
Класс PushXML - это иное. Здесь просто и быстро записываем XML как код.

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

Write  Class(PushXML).
  Code
  If Write.Init(True)         ! Записываем XML UTF-8 кирпичиком
     Write.AddCap             ! Стандартный заголовок
                              ! Комментарий
     Write.AddRem('Класс PushXML - это быстро и просто !')

     If Write.Opened('Root')  ! Открытый тег без атрибутов
     
                              ! Закрытый тег с атрибутами
        Write.SetAtr('Атрибут1','Значение А')
        Write.SetAtr('Атрибут2','Значение Б')
        Write.Closed('ЗакрытыйТег1')
        
                              ! Открытый тег с атрибутами
        Write.SetAtr('Атрибут3','Значение В')
        If Write.Opened('ОткрытыйТег1')
        
                              ! Закрытый тег с атрибутами и значением
           Write.SetAtr('Атрибут4',    'Значение Г')
           Write.Closed('ЗакрытыйТег2','Значение Д')
           
                              ! Закрыть открытый тег
           Write.EndTag('ОткрытыйТег1')
        end
                              ! Тег с файлом в BASE64
        Write.AddFile('Файл','test.xml')
        
                              ! Запись в XML пакет произвольного текста
        Write.AddStr('<?mso-application progid="Excel.Sheet"?>')
        
        Write.EndTag('Root')  ! Закрыть открытый тег
     end
                              ! Запись XML в файл
     Write.SaveAs('TestPush.xml')
     Write.Kill
  end
Бонусом есть несколько методов для записи блоков ЭДО и разбора строки ФИО на составляющие. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7314
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

В первом сообщении сабж обновлён до версии 07.04.2023 г.
-----------------------------------------------------------------------------
- Добавлена запись / чтение тегов с секциями CDATA;
- Загрузка вложенных списков с тегами (ранее только с атрибутами);
- Добавлен пример загрузки документа ЭДО со списком марок (КИЗ).

Что бы не создавать монстра - сделано несколько примеров документов ЭДО,
которые мона переключать в тексте примера:

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

Loc:FileXML  CString('test.xml')  ! Имя файла с XML пакетом ЭДО (базовая комплектация)
!Loc:FileXML  CString('pros.xml') ! Имя файла с XML пакетом ЭДО (прослеживаемость)
!Loc:FileXML  CString('mark.xml') ! Имя файла с XML пакетом ЭДО (КИЗ - марки)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Непонятно почему, разбираться не стал. Не грузит в очередь с префиксом.

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

XMLQueue2          QUEUE,PRE(Q2)
SCInvoice           GROUP
Number               STRING(255)
AccountDate          STRING(255)
...
tXML.ToQueue(XMLQueue2, 'SCInvoice') 
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7314
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Сопоставление имени тега и поля в группе (записи очереди) при парсе идёт по имени.
Поэтому при наличии префикса нужно указывать для полей имя тега в Name('TagName').
Я так понимаю. :)
За теми кто отстал - не возвращаться. (С) Кодекс
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

Попробовал разобрать yml файл, получилось сразу :cat:
Спасибо большое Вам Игорь. :ty:
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

Дилетантский вопрос, не знаю как разобрать, описать такую строку, чтобы получить значение - Спомб, ракети, кобри

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

<category id="63870602" parentId="63870575">Спомб, ракети, кобри</category>
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7314
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Это просто накрученная группа.
Здесь для тега задано значение "category" = "Спомб, ракети, кобри" и два атрибута: id="63870602" / parentId="63870575"

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

TheObject Group
Category String
ID Long
ParenID Long
  end
Распарсит ли его класс ? Не знаю - пробуйте. :) Вот из-за подобных вывертов XML и был придуман JSON. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

Игорь Столяров писал(а): 19 Октябрь 2023, 18:05 Это просто накрученная группа.
Здесь для тега задано значение "category" = "Спомб, ракети, кобри" и два атрибута: id="63870602" / parentId="63870575"

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

TheObject Group
Category String
ID Long
ParenID Long
  end
Распарсит ли его класс ? Не знаю - пробуйте. :) Вот из-за подобных вывертов XML и был придуман JSON. ;)
К сожалению не распарсил, пробовал в разных вариациях, парсит только значения id и parentId, не могу получить значение - category
Возможно есть другие варианты?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7314
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

1. В классе PrepareXML включите вызов ViewXML(Self.XmlDoc) - что бы посмотреть как парсер видит структуру такого XML.
2. Возможно он считает что здесь вложенная группа. Что-то вроде:

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

TheObject Group
Inside Group
Category String
  end
ID Long
ParenID Long
  end
или "Спомб, ракети, кобри" - это значение родительского тега (в который вложена структура Category) ...
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить