пятница, 25 октября 2013 г.

Чтение XML средствами ABAP

Сегодня будем разбирать XML используя класс cl_xml_document и интерфейсы if_ixml_node, if_ixml_node_iterator, if_ixml_node_filter.


Есть XML вида:

Мы хотим получить данные, которые лежат в узлах ZFPLAT.
Можно написать трансформацию, которая будет парсить XML и аккуратно складывать данные в таблицу, но мы пойдем обходным путем - будем разбирать XML функционалом ABAP.
Ниже пример отчета:
Код
report zread_xml_loc. data: filename type localfile value 'C:\TEMP\IDoc\ZCUSTCONTR_256942.xml', lr_xml type ref to cl_xml_document, lr_node type ref to if_ixml_node, lr_child_node type ref to if_ixml_node, lr_iterator type ref to if_ixml_node_iterator, lr_filter type ref to if_ixml_node_filter, node_name type string, node_type type i, value type string, rc type sy-subrc. start-of-selection. create object lr_xml. " Читаем XML из файла rc = lr_xml->import_from_file( filename ). check rc eq 0. lr_node = lr_xml->m_document. check not lr_node is initial. " Создаем фильтр для прохождения по всем узлам ZFPLAT lr_filter = lr_node->create_filter_name( name = 'ZFPLAT' ). " Создаем итератор и задаем для него фильтр для перемещения по узлам lr_iterator = lr_node->create_iterator( ). rc = lr_iterator->set_filter( lr_filter ). check rc eq 0. " Переходим на первый узел ZFPLAT lr_node = lr_iterator->get_next( ). while not lr_node is initial. " Проходим по всем дочерним узлам lr_child_node = lr_node->get_first_child( ). while not lr_child_node is initial. node_type = lr_child_node->get_type( ). case node_type. when lr_child_node->co_node_element. clear: value,node_name. value = lr_child_node->get_value( ). node_name = lr_child_node->get_name( ). write: node_name, '=', value. endcase. lr_child_node = lr_child_node->get_next( ). endwhile. lr_node = lr_iterator->get_next( ). write: /. endwhile. lr_xml->free( ).

Результат работы:

Комментариев нет:

Отправить комментарий