Создадим простой XML документ следующего вида:
В транзакции SE11 создаем новый тип данных с необходимыми полями
Создадим табличный тип
Теперь перейдем в транзакцию STRANS
Указываем «простую трансформацию»
В открывшемся окне выбираем кнопку графического редактирования:
Вставляем новый узел:
Перетаскиваем узел во вторую часть экрана:
Должно получиться что-то типа такого:
Возвращаемся обратно, не забыв сохранить изменения:
Мы видим, что автоматически сгенерировались все теги
Активируем:
Теперь переходим в SE38 и пишем такой код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
" DATA lt_file TYPE sdokcntbins. DATA lv_len TYPE i. DATA(lt_people) = VALUE zzz_t_xml( ( name = 'Иванов И.И.' age = 20 position = 'Менеджер' ) ( name = 'Петров П.П.' age = 25 position = 'Старший Менеджер' ) ( name = 'Сидоров С.С.' age = 25 position = 'Руководитель' ) ). CALL TRANSFORMATION zzz_test_xml_generate SOURCE people = lt_people RESULT XML DATA(lv_xml). CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_xml IMPORTING output_length = lv_len TABLES binary_tab = lt_file. CONSTANTS c_file TYPE string VALUE 'C:\Users\Pashigorev-AY\Desktop\example.xml'. cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_len " File length for binary files filename = c_file " Name of file filetype = 'BIN' " File type (ASCII, binary ...) CHANGING data_tab = lt_file " Transfer table EXCEPTIONS OTHERS = 1 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. RETURN. ENDIF. |
Результат запуска:
Обратите внимание на имена узлов, они точно такие же как в нашей структуре.
Если мы хотим чтобы они отличались, можно просто переименовать их в трансформации
Добавление атрибутов
Для того чтобы добавить динамические атрибуты существует конструкция
1 |
<tt:attribute name="NAME" value-ref="VALUE" /> |
Добавим атрибуты в XML который создавался на прошлом шаге. У каждого человека может быть свой набор заранее определенных атрибутов. Расширим тип соответствующим образом.
В трансформацию добавим узел с тегом <tt:attribute name=''... /> Который будет появляться в случае, если значение соответствующего атрибута заполнено. Данное условие содержится в теге <tt:cond check="not-initial(ATTRIBUTES.ATTRIBUTEN)"> .
В результате имеем следующую трансформацию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?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="ROOT" type="?"/> <tt:root name="PEOPLE" type="ddic:ZZZ_T_XML"/> <tt:template> <people> <tt:loop ref=".PEOPLE"> <person> <tt:cond check="not-initial(ATTRIBUTES.ATTRIBUTE1)"> <tt:attribute name="attirbute1" value-ref="ATTRIBUTES.ATTRIBUTE1" /> </tt:cond> <tt:cond check="not-initial(ATTRIBUTES.ATTRIBUTE2)"> <tt:attribute name="attirbute2" value-ref="ATTRIBUTES.ATTRIBUTE2" /> </tt:cond> <tt:cond check="not-initial(ATTRIBUTES.ATTRIBUTE3)"> <tt:attribute name="attirbute3" value-ref="ATTRIBUTES.ATTRIBUTE3" /> </tt:cond> <tt:cond check="not-initial(ATTRIBUTES.ATTRIBUTE4)"> <tt:attribute name="attirbute4" value-ref="ATTRIBUTES.ATTRIBUTE4" /> </tt:cond> <name tt:value-ref="NAME"/> <age tt:value-ref="AGE"/> <position tt:value-ref="POSITION"/> </person> </tt:loop> </people> </tt:template> </tt:transform> |
Заполняем данные и запускаем программу
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DATA(lt_people) = VALUE zzz_t_xml( ( name = 'Иванов И.И.' age = 20 position = 'Менеджер' attributes = VALUE zzz_s_xml_attribute_list( attribute1 = 'VALUE1' attribute2 = 'VALUE2' attribute3 = 'VALUE3' attribute4 = 'VALUE4' ) ) ( name = 'Петров П.П.' age = 25 position = 'Старший Менеджер' attributes = VALUE zzz_s_xml_attribute_list( attribute3 = 'VALUE5' attribute4 = 'VALUE6' ) ) ( name = 'Сидоров С.С.' age = 25 position = 'Руководитель' ) ). CALL TRANSFORMATION zzz_test_xml_generate SOURCE people = lt_people RESULT XML DATA(lv_xml). |
Результат выполнения: