Рассмотрим, как использовать простую трансформацию для парсинга XML-файла.
Допустим, имеем простой XML-файл.
Создадим структуру ZSTEST_COMPANY, по иерархии полей похожую на иерархию узлов в XML-файле.
Структура ZSTEST_EMPLOYEE
Тип таблицы ZTTEST_EMPLOYEE структурой ZSTEST_EMPLOYEE.
Структура ZSTEST_COMPANY
В транзакции XSLT_TOOL (или STRANS) ввести имя трансформации, нажать «Создать». Далее ввести краткое описание и выбрать тип S (простая трансформация). Нажать кнопку «Графическая обработка простой трансформации» (Ctrl+Shift+F11). Нажать правой кнопкой в левой части, выбрать «Insert new root».
Теперь ABAP-код как спарсить XML в структуру:
И обратное преобразование из структуры в XML-файл:
PS: код трансформации:
Допустим, имеем простой XML-файл.
<?xml version="1.0" encoding="utf-8"?> <Company> <Name>SuperCompany</Name> <Address>Russia, Moscow</Address> <Code>AA-001</Code> <Employee Type="FT"> <Name>James</Name> <Number>007</Number> </Employee> <Employee Type="FT"> <Name>Steve</Name> <Number>010</Number> </Employee> </Company>
Создание необходимых типов в словаре
Создадим структуру ZSTEST_COMPANY, по иерархии полей похожую на иерархию узлов в XML-файле.
Структура ZSTEST_EMPLOYEE
Поле | Тип | Длина | Описание |
TYPE | CHAR | 2 | |
EMP_NAME | CHAR | 50 | |
EMP_NUMBER | NUMC | 10 |
Тип таблицы ZTTEST_EMPLOYEE структурой ZSTEST_EMPLOYEE.
Структура ZSTEST_COMPANY
Поле | Тип | Длина | Описание |
COMP_NAME | CHAR | 50 | |
COMP_ADDRESS | CHAR | 100 | |
EMPLOYEE | ZTTEST_EMPLOYEE |
Создание трансформации
В транзакции XSLT_TOOL (или STRANS) ввести имя трансформации, нажать «Создать». Далее ввести краткое описание и выбрать тип S (простая трансформация). Нажать кнопку «Графическая обработка простой трансформации» (Ctrl+Shift+F11). Нажать правой кнопкой в левой части, выбрать «Insert new root».
Нажать зелёную галку. Перетащить элемент COMPANY в правую часть.
Элемент ROOT в левой части можно удалить. Теперь в правой части иерархию узлов нужно привести в соответствие с иерархией в XML-файле. В нашем случае надо сделать элемент TYPE атрибутом. Для этого нажать на нём правой кнопкой и выбрать «Change to attribute». Обратите внимание, что символом таблицы отмечены элементы, которые могут повторяться в XML-файле. Сохраняем и нажимаем «Назад».
В редакторе подкорректируем имена узлов в соответствии с файлом и удалим лишние тэги. Например, в нашем случае тэги <EMPLOYEE> и </EMPLOYEE> лишние.
Обратите внимание, что элементы между <tt:loop> и </tt:loop> могут повторяться в XML-файле. Должно получиться примерно так.
Узлы, которые могут отсутствовать в XML-файле, нужно заключить в <tt:cond></tt:cond>. А узлы, которые нужно пропустить – в <tt:skip></tt:skip>. В примере ниже узел Address может отсутствовать, а узел Code будет пропущен.
ABAP-программа
Теперь ABAP-код как спарсить XML в структуру:
DATA: lt_xml TYPE solix_tab, ls_company TYPE zstest_company, lr_excep1 TYPE REF TO cx_st_match_element, lr_excep2 TYPE REF TO cx_st_match_attribute, lv_msg TYPE string. TRY. CALL TRANSFORMATION ztest_company SOURCE XML lt_xml RESULT company = ls_company. CATCH cx_st_match_element INTO lr_excep1. lv_msg = lr_excep1->get_text( ). CATCH cx_st_match_attribute INTO lr_excep2. lv_msg = lr_excep2->get_text( ). ENDTRY.
И обратное преобразование из структуры в XML-файл:
CLEAR: ls_company, ls_employee. ls_company-comp_name = 'Company 1'. ls_employee-type = 'AA'. ls_employee-emp_name = 'Nick'. ls_employee-emp_number = '099'. TRY . CALL TRANSFORMATION ztest_company SOURCE company = ls_company RESULT XML lt_xml. CATCH cx_root. ENDTRY.
<?sap.transform simple?> <tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined"> <tt:root name="COMPANY" type="ddic:ZSTEST_COMPANY"/> <tt:template> <Company> <Name tt:value-ref="COMPANY.COMP_NAME"/> <tt:cond> <Address tt:value-ref="COMPANY.COMP_ADDRESS"/> </tt:cond> <tt:skip count="*" name="Code"></tt:skip> <tt:loop ref="COMPANY.EMPLOYEE"> <Employee> <tt:attribute name="Type" value-ref="TYPE"/> <Name tt:value-ref="EMP_NAME"/> <Number tt:value-ref="EMP_NUMBER"/> </Employee> </tt:loop> </Company> </tt:template> </tt:transform>
Комментариев нет:
Отправить комментарий