Класс tXML (интерфейс для штатного CpXML)
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Привет всем !
В контексте существующих задач для работы с XML, сделал простой интерфейс (даже не субкласс !).
Используются только штатные компоненты Clarion и WinAPI без зависимостей и самостийных улучшений.
Проект полный OpenSource & FreeWare навсегда.
Принцип работы парсера ToyXML до неприличия простой:
-------------------------------------------------------------------------
Задаём в описании GROUP / QUEUE структуру XML файла (или его фрагмента) и загружаем
одной командой начиная с указанного тега. Всё. И это полное описание работы парсера.
Сейчас реализован функционал:
-----------------------------------------
- Загрузка XML в кодировке Windows-1251 / UTF-8;
- Загрузка произвольных списков с файлами (в кодировке BASE64);
- Загрузка данных из тегов с повторяющимися именами в разных группах / уровнях;
- Загрузка значений тега в связанный список (пока один, но заложено без ограничений);
- Методы загрузки списков с индикацией процесса выполнения;
- Запись XML пакетов показана в примере.
В качестве примера показан парс документа ЭДО:
- Получаем одной командой в GROUP собственно сам документ (это около 500 полей);
- Получаем список содержания, с вложенным списком кодов ОСУ, для каждой строки содержания;
С благодарностью, использованы идеи и код Yufil (Юрия Философова).
В контексте существующих задач для работы с XML, сделал простой интерфейс (даже не субкласс !).
Используются только штатные компоненты Clarion и WinAPI без зависимостей и самостийных улучшений.
Проект полный OpenSource & FreeWare навсегда.
Принцип работы парсера ToyXML до неприличия простой:
-------------------------------------------------------------------------
Задаём в описании GROUP / QUEUE структуру XML файла (или его фрагмента) и загружаем
одной командой начиная с указанного тега. Всё. И это полное описание работы парсера.
Сейчас реализован функционал:
-----------------------------------------
- Загрузка XML в кодировке Windows-1251 / UTF-8;
- Загрузка произвольных списков с файлами (в кодировке BASE64);
- Загрузка данных из тегов с повторяющимися именами в разных группах / уровнях;
- Загрузка значений тега в связанный список (пока один, но заложено без ограничений);
- Методы загрузки списков с индикацией процесса выполнения;
- Запись XML пакетов показана в примере.
В качестве примера показан парс документа ЭДО:
- Получаем одной командой в GROUP собственно сам документ (это около 500 полей);
- Получаем список содержания, с вложенным списком кодов ОСУ, для каждой строки содержания;
С благодарностью, использованы идеи и код Yufil (Юрия Философова).
- Вложения
-
- tXML.zip
- Версия от 07.04.2023 г.
- (35.22 КБ) 51 скачивание
Последний раз редактировалось Игорь Столяров 07 Апрель 2023, 8:46, всего редактировалось 17 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
Вспомнил, что еще, кроме xpath, из современного функционала надо - проверка по xsd схеме. Например, для разных форм отчетности, которые все в xml. Через vbscript я не реализовывал, показалось, что удобнее закидывать файлик по ftp на хостинг, а следом стартовать php скрипт, передав имя файла через параметр. Скрипт возвращает список ошибок или сообщение, что их нет. На всякий случай, пример реализации на php, вдруг пригодиться.
Код: Выделить всё
<?php
// перевод символов из utf8 в win
function utf8_win($s)
{
return strtr ($s, array
("\xD0\xB0"=>"а", "\xD0\x90"=>"А", "\xD0\xB1"=>"б", "\xD0\x91"=>"Б",
"\xD0\xB2"=>"в", "\xD0\x92"=>"В", "\xD0\xB3"=>"г", "\xD0\x93"=>"Г",
"\xD0\xB4"=>"д", "\xD0\x94"=>"Д", "\xD0\xB5"=>"е", "\xD0\x95"=>"Е",
"\xD1\x91"=>"ё", "\xD0\x81"=>"Ё", "\xD0\xB6"=>"ж", "\xD0\x96"=>"Ж",
"\xD0\xB7"=>"з", "\xD0\x97"=>"З", "\xD0\xB8"=>"и", "\xD0\x98"=>"И",
"\xD0\xB9"=>"й", "\xD0\x99"=>"Й", "\xD0\xBA"=>"к", "\xD0\x9A"=>"К",
"\xD0\xBB"=>"л", "\xD0\x9B"=>"Л", "\xD0\xBC"=>"м", "\xD0\x9C"=>"М",
"\xD0\xBD"=>"н", "\xD0\x9D"=>"Н", "\xD0\xBE"=>"о", "\xD0\x9E"=>"О",
"\xD0\xBF"=>"п", "\xD0\x9F"=>"П", "\xD1\x80"=>"р", "\xD0\xA0"=>"Р",
"\xD1\x81"=>"с", "\xD0\xA1"=>"С", "\xD1\x82"=>"т", "\xD0\xA2"=>"Т",
"\xD1\x83"=>"у", "\xD0\xA3"=>"У", "\xD1\x84"=>"ф", "\xD0\xA4"=>"Ф",
"\xD1\x85"=>"х", "\xD0\xA5"=>"Х", "\xD1\x86"=>"ц", "\xD0\xA6"=>"Ц",
"\xD1\x87"=>"ч", "\xD0\xA7"=>"Ч", "\xD1\x88"=>"ш", "\xD0\xA8"=>"Ш",
"\xD1\x89"=>"щ", "\xD0\xA9"=>"Щ", "\xD1\x8A"=>"ъ", "\xD0\xAA"=>"Ъ",
"\xD1\x8B"=>"ы", "\xD0\xAB"=>"Ы", "\xD1\x8C"=>"ь", "\xD0\xAC"=>"Ь",
"\xD1\x8D"=>"э", "\xD0\xAD"=>"Э", "\xD1\x8E"=>"ю", "\xD0\xAE"=>"Ю",
"\xD1\x8F"=>"я", "\xD0\xAF"=>"Я"));
}
function libxml_display_error($error)
{
$return = "\r\n";
switch ($error->level) {
case LIBXML_ERR_WARNING:
$return .= "Предупреждение $error->code: ";
break;
case LIBXML_ERR_ERROR:
$return .= "Ошибка $error->code: ";
break;
case LIBXML_ERR_FATAL:
$return .= "Фатальная ошибка $error->code: ";
break;
}
$return .= trim($error->message);
$return .= " строка $error->line \r\n";
return $return;
}
function libxml_display_errors()
{
$errors = libxml_get_errors();
foreach ($errors as $error) {
print utf8_win(libxml_display_error($error));
}
libxml_clear_errors();
}
setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251', 'russian');
echo 'Проверка xml-файла по xsd-схеме' . "\r\n";
$reg = $_GET['reg'];
$fnamePar = $_GET['fname'];
$fname = '../../fssupport/services/' . $fnamePar;
$name_xsd = '';
switch ($reg)
{
case "1":
$name_xsd = 'fns_nds_decl2015.xsd';
break;
case "2":
$name_xsd = 'fns_nds_decl2015_pok.xsd';
break;
case "3":
$name_xsd = 'fns_nds_decl2015_prod.xsd';
break;
case "4":
$name_xsd = 'alco11.xsd';
break;
case "5":
$name_xsd = 'alco12.xsd';
break;
};
if (!file_exists($fname))
{
echo 'Не найден файл для проверки!';
}
elseif (!file_exists($name_xsd))
{
echo 'Не найдена схема для проверки!';
unlink($fname);
}
else
{
libxml_use_internal_errors(true);
$xml = new DOMDocument('1.0', 'Windows-1251');
$xml->load($fname);
if (!$xml->schemaValidate($name_xsd))
{
print "Получен список ошибок! \r\n";
libxml_display_errors();
}
else
{
echo 'Успех!';
};
unlink($fname);
};
?>
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Ну да, штука полезная для отправляемых налоговых отчётов.
Но как и xPath (не путать с пространством имён !) - это дополнительный прибамбас к XML.
Но как и xPath (не путать с пространством имён !) - это дополнительный прибамбас к XML.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
Не-не, это не прибамбасы, это часть стандарта xml. Причем и то, и другое нужно в реальной работе.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Абсолютно с Вами согласен.
На самом деле там много расширений стандарта, те же стили отображения XSL, SOAP, xQuery и т.д.
И, как говорит пословица: была бы задача, а парсер-то всегда найдётся ...
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
Поэтому мне и не хочется использовать парсер из поставки клариона. Делали его когда-то давно дл SV прибалтийские оффшорщики, насколько я слышал. Разбираться с этим кодом уже некому, а стандарт мейнстримный и успел развиться с тех пор. А поскольку xml это формат обмена с внешними системами, то после разработки функционала на основе штатного парсера может потребоваться полная переделка. Я вижу 2 пути. Либо покупать продукт у сторонних разработчиков тип изи или кейпсофт, в надежде, что они и дальше будут обеспечивать необходимый функционал. Либо заюзать скрипты для решения подобных задач. Понятно, что скрипты не от хорошей жизни. Зато там много пользователей, хорошо протестировано и гарантировано будет поддерживать изменения в стандарте. На сегодня я вижу расширение за счёт скриптов работы с xml и работы с офисным пакетами (оо и мс).
Пока писал, в голову пришла мысль, что может быть интересен скрещенный вариант. Сделать класс, который может использовать как штатный парсер, так и скрипты.
Пока писал, в голову пришла мысль, что может быть интересен скрещенный вариант. Сделать класс, который может использовать как штатный парсер, так и скрипты.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Угу. Причём делали 20 лет тому назад, люди со славянскими именами.
Скорее всего это выкупленный SV класс, как и диаграммы SVGRAPH.
Код: Выделить всё
! DESCRIPTION...: Library for XML Export/Import
! COPYRIGHT.....: Copyright 2003 SoftVelocity Inc. All rights reserved
! ---------- ------------------------------------------------
! 2003-03-07 Modifyed by Anatoly Medyntsev
Т.е. грубо говоря: остров живёт и развивается, а мостик из Clarion на него 20-ти летний.
Скрипты и изи хмл - это такие же мостики на тот же самый остров, т.е. выбор есть ...
К глубокому сожалению в Clarion это не работает.
Пример тому лучший из них: iqXML. (там была платная подписка на тех. поддержку).
Нет объёма рынка для полноценного развития и поддержки разработок (тех самых минимальных 365 юзеров на подписке).
Я уже приводил пример - когда NASA поставила условие сделать B4A бесплатным для заключения контракта.
Все понимают, что если с инструментальным средством работают два с половиной пользователя - то ему быстро придёт пипец !
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
SVGRAPH делал Сергей Чушкин по контракту с SV.
Тогда какие выводы? Штатный парсер сделан 20 лет назад и там остался. Сторонним разработчикам не доверяете (обратите только внимание, что изи продает с исходными текстами, не знаю, поможет ли это чем). Остаются скрипты...
Помните, как в сериале "Миллиарды" лысая девочка говорила, что залог успеха в сочетании питона и с++? В нашем случае интеграция со скриптами может продлить жизнь кларионовским приложениям.
Тогда какие выводы? Штатный парсер сделан 20 лет назад и там остался. Сторонним разработчикам не доверяете (обратите только внимание, что изи продает с исходными текстами, не знаю, поможет ли это чем). Остаются скрипты...
Помните, как в сериале "Миллиарды" лысая девочка говорила, что залог успеха в сочетании питона и с++? В нашем случае интеграция со скриптами может продлить жизнь кларионовским приложениям.
C6/C11, ШВС, tps/btrieve.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1379
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Класс tXML (интерфейс для штатного CpXML)
Еще хороший вариант - найти актуальную либу на С и написать к ней обертку.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Есть опасения, что это (опять) будет очередная обёртка на обёртку для Microsoft XML ...
Здесь важно ответить на вопрос: что мы сейчас не можем сделать через штатный парсер CpXML ?
(ещё раз напоминаю, пространство имён и язык запросов xPath - это разное !)
Cогласен ! Если говорить о запуске внешних скриптов под интерпретатором, то с радостью бы использовал интерфейс к Pithon или Lua ...
Не вижу ничего плохого и в VBScript, мы же создаём отчёты через VBA ... но без запуска внешних скриптов и обмена текстовыми файлами.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
С Питоном есть проблема, у них только свежие версии ос поддерживаются.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Очень грамотный коммерческий подход. Ибо нефиг по 20 лет под одной Windows 2003 сидеть !
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Класс tXML (интерфейс для штатного CpXML)
Грамотный Игорь, помнится, говорил, что ранее win10 не поддерживает. А потом клиент его нагнул. Было?
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Класс tXML (интерфейс для штатного CpXML)
Не помню - нужно смотреть на контекст.
Если о программах - то мы поддерживаем работу на всех Windows до XP включительно. Хотя это и не просто.
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1379
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Класс tXML (интерфейс для штатного CpXML)
Нет, такие либы обычно пишут для линуксов разных с нуля, и уже потом портируют под виндуИгорь Столяров писал(а): ↑19 Февраль 2023, 21:20 Есть опасения, что это (опять) будет очередная обёртка на обёртку для Microsoft XML ...