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

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

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

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

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

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

Привет всем !

В контексте существующих задач для работы с 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 КБ) 43 скачивания
Последний раз редактировалось Игорь Столяров 07 Апрель 2023, 8:46, всего редактировалось 17 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4493
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 31 раз

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

Сообщение finsoftrz »

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

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

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

Ну да, штука полезная для отправляемых налоговых отчётов.
Но как и xPath (не путать с пространством имён !) - это дополнительный прибамбас к XML.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4493
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 31 раз

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

Сообщение finsoftrz »

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

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

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

finsoftrz писал(а): 19 Февраль 2023, 15:43 Причем и то, и другое нужно в реальной работе.
Абсолютно с Вами согласен.
На самом деле там много расширений стандарта, те же стили отображения XSL, SOAP, xQuery и т.д.
И, как говорит пословица: была бы задача, а парсер-то всегда найдётся ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4493
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 31 раз

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

Сообщение finsoftrz »

Поэтому мне и не хочется использовать парсер из поставки клариона. Делали его когда-то давно дл SV прибалтийские оффшорщики, насколько я слышал. Разбираться с этим кодом уже некому, а стандарт мейнстримный и успел развиться с тех пор. А поскольку xml это формат обмена с внешними системами, то после разработки функционала на основе штатного парсера может потребоваться полная переделка. Я вижу 2 пути. Либо покупать продукт у сторонних разработчиков тип изи или кейпсофт, в надежде, что они и дальше будут обеспечивать необходимый функционал. Либо заюзать скрипты для решения подобных задач. Понятно, что скрипты не от хорошей жизни. Зато там много пользователей, хорошо протестировано и гарантировано будет поддерживать изменения в стандарте. На сегодня я вижу расширение за счёт скриптов работы с xml и работы с офисным пакетами (оо и мс).

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

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

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

finsoftrz писал(а): 19 Февраль 2023, 16:25 Делали его когда-то давно дл SV прибалтийские оффшорщики
Угу. Причём делали 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-ти летний. :)
Скрипты и изи хмл - это такие же мостики на тот же самый остров, т.е. выбор есть ... ;)
finsoftrz писал(а): 19 Февраль 2023, 16:25 покупать продукт у сторонних разработчиков тип изи или кейпсофт
К глубокому сожалению в Clarion это не работает.
Пример тому лучший из них: iqXML. (там была платная подписка на тех. поддержку).
Нет объёма рынка для полноценного развития и поддержки разработок (тех самых минимальных 365 юзеров на подписке).

Я уже приводил пример - когда NASA поставила условие сделать B4A бесплатным для заключения контракта.
Все понимают, что если с инструментальным средством работают два с половиной пользователя - то ему быстро придёт пипец ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4493
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 31 раз

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

Сообщение finsoftrz »

SVGRAPH делал Сергей Чушкин по контракту с SV.

Тогда какие выводы? Штатный парсер сделан 20 лет назад и там остался. Сторонним разработчикам не доверяете (обратите только внимание, что изи продает с исходными текстами, не знаю, поможет ли это чем). Остаются скрипты...
Помните, как в сериале "Миллиарды" лысая девочка говорила, что залог успеха в сочетании питона и с++? В нашем случае интеграция со скриптами может продлить жизнь кларионовским приложениям.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

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

Сообщение RaFaeL »

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

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

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

RaFaeL писал(а): 19 Февраль 2023, 20:43 Еще хороший вариант - найти актуальную либу на С и написать к ней обертку.
Есть опасения, что это (опять) будет очередная обёртка на обёртку для Microsoft XML ... ;)
Здесь важно ответить на вопрос: что мы сейчас не можем сделать через штатный парсер CpXML ?
(ещё раз напоминаю, пространство имён и язык запросов xPath - это разное !)
finsoftrz писал(а): 19 Февраль 2023, 18:41 лысая девочка говорила, что залог успеха в сочетании питона и с++?
Cогласен ! Если говорить о запуске внешних скриптов под интерпретатором, то с радостью бы использовал интерфейс к Pithon или Lua ...
Не вижу ничего плохого и в VBScript, мы же создаём отчёты через VBA ... но без запуска внешних скриптов и обмена текстовыми файлами.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4493
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 31 раз

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

Сообщение finsoftrz »

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

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

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

Очень грамотный коммерческий подход. Ибо нефиг по 20 лет под одной Windows 2003 сидеть ! :D
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4493
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 31 раз

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

Сообщение finsoftrz »

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

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

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

finsoftrz писал(а): 19 Февраль 2023, 22:24 говорил, что ранее win10 не поддерживает
Не помню - нужно смотреть на контекст.
Если о программах - то мы поддерживаем работу на всех Windows до XP включительно. Хотя это и не просто. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

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

Сообщение RaFaeL »

Игорь Столяров писал(а): 19 Февраль 2023, 21:20 Есть опасения, что это (опять) будет очередная обёртка на обёртку для Microsoft XML ...
Нет, такие либы обычно пишут для линуксов разных с нуля, и уже потом портируют под винду
Ответить