Обработка XML документа

Ранее работа с XML сводилась к формированию файлов налоговых деклараций, отчетов в ПФ и Соцстрах. Для этого хватало возможностей интерпретатора ИБ.

Совсем другое дело работа с ЕГАИС. Тут надо не только отправлять XML, но и принимать и парсить(обрабатывать для наглядности пользователю). Причем в больших количествах. И желательно обрабатывать "вживую", т.е. сразу из XML представлять в удобном для людей виде. Без перегонки в базу.

Почитав что пишут умные люди, стал понятен общий алгоритм обработки.

  • Очевидно, нужна рекурсия для обхода ветвей.
  • Нужны callback's. Т.е. функции обратного вызова.("обратки")
  • Все это работает с парсером. Или который в Windows, или внешний.
  • Нужна связка с XSD(описание схемы).

Рекурсия, в принципе, работает и в ИБ. А вот с функциями обратного вызова в интерпретаторе ИБ глухо. Да и в 1с, насколько знаю, тоже их нет. Т.к. для этого нужны указатели(или ссылки) на функции. Или возможность передавать функцию как параметр. Отсюда вывод: по умному можно сделать только в более развитых языках. Например в Borland C++

Чтение XML

Поначалу пару файлов я делал без использования XSD. Т.е. напускал рекурсию на XML, а в "обратке" в зависимости от названия тэга заносил в определенную колонку таблицы. Когда немного колонок, еще терпимо. Но когда дошел до накладной, где колонок несколько десятков, как-то приуныл. Не улучшило настроения и попытка использования XSL(скрипт для визуализации XML). Т.к. все равно пришлось писать свой скрипт для каждого документа. И решил подключить XSD.

В итоге краткая схема такая:

  • Напускаем рекурсию на корень документа XSD. Встаем на корень документа XML. Назначаем указатель на функцию-"обратку".
    • Считываем все служебные тэги(описание тэга(будет заголовком колонок), форматы, кратность и прочее) в массив параметров(МП)
    • При подходе к тэгу, переходим на нужный тэг в XML
    • Вызываем обратку, передав как параметр МП(массив параметров) и ноду XML.
      • В обратке как бонус получаем не только ноду XML с нужным нам значением, но и массив всех параметров(с заголовком колонки таблицы, форматом и прочим). И заполняем не только ячейку со значением, но и заголовки колонок.

И после этого работа пошла многократно веселее))). Все-таки С++ - это вешь!

Запись XML

После удачного использования XSD для чтения XML, не было сомнений использования его и при записи

  • Создаем новый XML. Встаем на корень документа. Напускаем рекурсию на XSD.
  • Считываем все служебные тэги(описание тэга(будет заголовком колонок), форматы, кратность и прочее) в массив параметров(МП)
  • При подходе к тэгу, создаем нужную ноду XML
  • Вызываем обратку, передав как параметр МП(массив параметров) и ноду XML.
    • В обратке запрашиваем нужную переменную
    • Форматируем переменную согласно полученному МП
    • Записываем значение в ноду
  • Добавляем ноду в XML

Переменные для запроса удобно хранить в именнованном массиве. Типа "Документ_Продавец_Имя"=>"Таня". Или для множественных тэгов "bill_items_1"=>"Яблоки", "bill_items_2"=>"Груши" и т.п... Иначе проблематично связать переменную с иерархией тэгов.

Ушлые люди могут возразить: "Ты чего несешь? Какие именнованные массивы в С++?!!!!". Ответ: В С++ если чего-то нет, всегда можно сделать. Даже написать себе свой язык).

Преимущества использования XSD очевидны. Это автоматическое именование колонок таблицы, форматирование, дикая экономия времени. И при изменении XSD, не надо ничего править. Только добавить нужные переменные(именованный массив). Поразила скорость работы парсера. По сравнению с интерпретатором в сотни раз. Это дало возможность работать с XML как с базой. Даже реализовать схему мастер-подчиненный. Т.е., например, в первой таблице - список полученных документов. При смене выбора документа вторая таблица довольно шустро заполняется содержанием документа.


Комментарии 0






Разрешённые теги: <b><i><br>Добавить новый комментарий: