Да, возможно придется разбирать xsd-схему, по ней генерить тэг за тэгом файл. Готовых решений не видел... Делал что-то подобное для казахстанской отчетности (там тоже xml определенной структуры выгружается): тэг за тэгом, замаялся.
Также делал выгрузку поставок сбытовых в xml (но тут формат xsd я уже сам придумал).
Если делать всё с нуля, то объем работы получается немаленький совсем...
Мое решение такое было:
Чтобы не забивать гвоздями тэги, можно написать XSLT-преобразование для xsd-шаблонов, сами шаблоны с сайта закачать в репозиторий (например, SMW0), затем в программе вызывать ваше преобразование (через CALL TRANSFORMATION), которое вернет структуру документа в виде внутренней таблицы, по этой структуре генерить xml, заполняя нужными значениями определенные тэги.
XSLT возвращает структуру в виде внутр. таблицы со строкой
Code:
NODE | PARENT_NODE.
Была также написана объектная обертка, которая по таблице структуры строила объектную иерархию документа xml, у которой были методы по заполнению xml определенными значениями.
Т.е. в программе, которая заполняет данными, вызов выглядел примерно так:
Code:
data lrf_node type ref to zcl...
lrf_node ?= document->get_elem_by_name( 'table' ).
lrf_node->set_attribute( 'name' 'val' ).
....
....
document->render_xml( ).
document - класс управления объектной иерерахией (тоже Z), метод render_xml обходит иерархию и, используя стандартные классы CL_IXML, генерит xml в виде бинарных данных, которые выгрузить куда-то - дело техники уже.
Вообщем, очень сложно и объемно получилось, но универсально (в случае изменения формата новый файл xsd закачивается в систему, правится немного программа заполнения данными, но тэги гвоздями нигде не перебиваются).
Это я вам описал свое решение.
Возможно, как-то проще сделать можно.
P.S.
1) ядро должно быть не ниже 7.00 (если не ошибаюсь), чтобы xslt там работали
2) NODE | PARENT_NODE будет работать, если имена тэгов с первого по n-1 уровень будут уникальны (иначе поле PARENT_NODE в таблице не будет правильно отражать иерархию). Или сделать структуру NODE_KEY | PARENT_NODE_KEY | NODE | PARENT_NODE, где NODE_KEY и PARENT_NODE_KEY - некие "суррогатные" ключи, например, натуральные числа, а NODE и PARENT_NODE - реальные имена тэгов