Класс tXML (интерфейс для штатного CpXML)
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
В первом сообщении сабж обновлён до версии 03.03.2023 г.
-----------------------------------------------------------------------------
- Убран старый рудиментный код (стало светлее);
- Скорость парса увеличена в разы за счёт построения таблицы полных имён полей структуры;
- Добавлен режим отладки для подсветки ошибок данных и работы парсера. Не ускоряет работу.
-----------------------------------------------------------------------------
- Убран старый рудиментный код (стало светлее);
- Скорость парса увеличена в разы за счёт построения таблицы полных имён полей структуры;
- Добавлен режим отладки для подсветки ошибок данных и работы парсера. Не ускоряет работу.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
В первом сообщении сабж обновлён до версии 06.03.2023 г.
-----------------------------------------------------------------------------
- Снято ограничение на кол-во дочерних списков в методе ToQueue;
- Добавлено правило 'IsList' для привязки дочерних списков;
- Упрощена внутренняя структура данных и методов класса.
Вообще, где-то в этом месте пришло понимание, что можно попробовать сделать
парсер основанный на рекурсивном раскручивании XML по структуре данных.
Но это уже на какой-нибудь в другой задаче и может быть не я.
P/S: Спасибо всем кто не поленился пнуть и прислать примеры документов ЭДО.
-----------------------------------------------------------------------------
- Снято ограничение на кол-во дочерних списков в методе ToQueue;
- Добавлено правило 'IsList' для привязки дочерних списков;
- Упрощена внутренняя структура данных и методов класса.
Вообще, где-то в этом месте пришло понимание, что можно попробовать сделать
парсер основанный на рекурсивном раскручивании XML по структуре данных.
Но это уже на какой-нибудь в другой задаче и может быть не я.
P/S: Спасибо всем кто не поленился пнуть и прислать примеры документов ЭДО.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
В первом сообщении сабж обновлён до версии 09.03.2023 г.
-----------------------------------------------------------------------------
- Добавлена настройка разделителя полей и тегов;
- Увеличена на порядок скорость создания списка полных имён полей структуры данных
(рекурсивный разбор полей GROUP за один проход).
-----------------------------------------------------------------------------
- Добавлена настройка разделителя полей и тегов;
- Увеличена на порядок скорость создания списка полных имён полей структуры данных
(рекурсивный разбор полей GROUP за один проход).
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
В первом сообщении сабж обновлён до версии 14.03.2023 г.
-----------------------------------------------------------------------------
Добавлены методы:
- SpecifiedTag() - проверка присутствия тега/атрибута в XML пакете;
- ValueByName() - получить значение поля по полному имени в структуре данных;
- ValueByGroup() - получить значение поля по имени из группы в структуре данных.
Использование новых методов продемонстрировано в примере загрузки пакета ЭДО.
-----------------------------------------------------------------------------
Добавлены методы:
- SpecifiedTag() - проверка присутствия тега/атрибута в XML пакете;
- ValueByName() - получить значение поля по полному имени в структуре данных;
- ValueByGroup() - получить значение поля по имени из группы в структуре данных.
Использование новых методов продемонстрировано в примере загрузки пакета ЭДО.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс 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
- ✯ Ветеран ✯
- Сообщения: 4664
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 8 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
Если про меня, то мне не интересно. Картинку прикольную прислали, показалось, что хорошо в тему вписывается.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
Безусловно, очень интересная картинка.
Спасибо, что находите возможность поддержать обсуждение !
Спасибо, что находите возможность поддержать обсуждение !
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
Сами приходите - у нас политика открытых дверей.
(С) NATO
(С) NATO
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
Было обсуждение, как добыть из пакета ЭДО штрих-код товара.
Если не брать во внимание экзотику пельменных цехов, то есть 3 (три) варианта,
где укротитель 1С может спрятать штрих-код в содержании пакета ЭДО:
Вроде бы (!) работает везде ...
Если не брать во внимание экзотику пельменных цехов, то есть 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
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 28 раз
- Поблагодарили: 22 раза
- Контактная информация:
Класс tXML (интерфейс для штатного CpXML)
Тот же test.xml в кодировке utf-8 не смог загрузить:
ошибка при загрузке и все тут.
Далее пробовал свой XML загрузить. У меня в некоторых поля используется CHR(19) по типу
Где @ = CHR(19)
Тоже не грузит. Я так понимаю функции XMLStringToDOM голову сносит
Код: Выделить всё
Loc:MyXML.Init(2,Loc:FileXML)
Далее пробовал свой XML загрузить. У меня в некоторых поля используется CHR(19) по типу
Код: Выделить всё
<ADDITIONALINFO>Документ создан на основе заказа @1856867 от 16@04601@0462023</ADDITIONALINFO>
Тоже не грузит. Я так понимаю функции XMLStringToDOM голову сносит
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
Потому, что загрузка из XML файла в UTF-8 файла выполняется как:
Код: Выделить всё
Loc:MyXML.Init(1,Loc:FileXML)
Код: Выделить всё
! Создать новый объект
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
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7419
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 50 раз
Класс tXML (интерфейс для штатного CpXML)
Попробовал несколько парсеров - так делать нельзя.
Здесь должно использоваться экранирование спецсимвола в строке.
За теми кто отстал - не возвращаться. (С) Кодекс
- Admin
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 28 раз
- Поблагодарили: 22 раза
- Контактная информация:
Класс tXML (интерфейс для штатного CpXML)
Спасибо. Со всем разобрался уже. Отличная работа!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса