REPORT ztext_qh_0007.
*常量-重复节点名称
CONSTANTS : con_repeat TYPE string VALUE 'CON_REPEAT'.
* xml 数据
DATA: lr_ixml TYPE REF TO if_ixml,
lr_document TYPE REF TO if_ixml_document,
lv_gid TYPE i, "定位节点
lv_xml_as_string TYPE xstring,
lt_xml_as_table TYPE dcxmllines WITH HEADER LINE,
lv_cstring TYPE string.
lr_ixml = cl_ixml=>create( ).
lr_document = lr_ixml->create_document( ).
*根节点
PERFORM frm_create_element USING lr_document space 'ROOT' space .
* Main
PERFORM frm_create_element USING lr_document 'ROOT' 'MAIN' space .
PERFORM frm_create_element USING lr_document 'MAIN' 'MAIN_ELEMENT_01' 'MAIN_01' .
PERFORM frm_create_element USING lr_document 'MAIN' 'MAIN_ELEMENT_02' 'MAIN_02' .
PERFORM frm_create_element USING lr_document 'MAIN' 'MAIN_ELEMENT_03' 'MAIN_03' .
*con_repeat
DATA:l_value(1) VALUE 0,
l_con_repeat_01(40),
l_con_repeat_02(40),
l_con_repeat_03(40).
DO 5 TIMES.
ADD 1 TO l_value.
l_con_repeat_01 = con_repeat && '_01' && l_value .
l_con_repeat_02 = con_repeat && '_02' && l_value .
l_con_repeat_03 = con_repeat && '_03' && l_value .
PERFORM frm_create_element USING lr_document 'ROOT' con_repeat space .
PERFORM frm_create_element USING lr_document con_repeat 'CON_REPEAT_01' l_con_repeat_01 .
PERFORM frm_create_element USING lr_document con_repeat 'CON_REPEAT_02' l_con_repeat_02 .
PERFORM frm_create_element USING lr_document con_repeat 'CON_REPEAT_03' l_con_repeat_03 .
ENDDO.
CALL FUNCTION 'SDIXML_DOM_TO_XML'
EXPORTING
document = lr_document
IMPORTING
xml_as_string = lv_xml_as_string
TABLES
xml_as_table = lt_xml_as_table
EXCEPTIONS
no_document = 1
OTHERS = 2.
lv_cstring = cl_proxy_service=>xstring2cstring( lv_xml_as_string ).
WRITE lv_cstring.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_CHILD
*&---------------------------------------------------------------------*
*& 添加子节点
*&---------------------------------------------------------------------*
* -->P_ text
* -->P_ text
* -->P_P_NUMBER text
*&---------------------------------------------------------------------*
FORM frm_create_element USING pr_document TYPE REF TO if_ixml_document "XML文档
p_parent TYPE string "父节点名称
p_name TYPE string "新建节点名称
p_value. "新建节点值
DATA: lv_value TYPE string,
lr_parent TYPE REF TO if_ixml_element,
lr_element TYPE REF TO if_ixml_element,
lr_parent_node TYPE REF TO if_ixml_node.
lv_value = p_value.
CONDENSE lv_value.
IF p_parent IS INITIAL."创建根节点
lr_element = lr_document->create_element( name = p_name ).
lr_document->append_child( new_child = lr_element ).
ELSE.
* 添加子节点
lr_parent = pr_document->find_from_name( name = p_parent ).
IF sy-subrc = 0.
lr_element = pr_document->create_simple_element( name = p_name
parent = lr_parent
value = lv_value ).
* 根据GID获取父节点
IF lv_gid IS NOT INITIAL AND p_parent EQ con_repeat.
lr_parent_node = pr_document->find_from_gid( gid = lv_gid ).
* 根据GID添加子节点
lr_parent_node->append_child( new_child = lr_element ).
ELSE.
* 直接添加子节点
lr_parent->append_child( new_child = lr_element ).
ENDIF.
* 获取con_repeat的gid
IF p_name EQ con_repeat.
CLEAR lv_gid.
lv_gid = lr_element->get_gid( ).
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
生成后XML文件:
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<MAIN>
<MAIN_ELEMENT_01>MAIN_01</MAIN_ELEMENT_01>
<MAIN_ELEMENT_02>MAIN_02</MAIN_ELEMENT_02>
<MAIN_ELEMENT_03>MAIN_03</MAIN_ELEMENT_03>
</MAIN>
<CON_REPEAT>
<CON_REPEAT_01>CON_REPEAT_011</CON_REPEAT_01>
<CON_REPEAT_02>CON_REPEAT_021</CON_REPEAT_02>
<CON_REPEAT_03>CON_REPEAT_031</CON_REPEAT_03>
</CON_REPEAT>
<CON_REPEAT>
<CON_REPEAT_01>CON_REPEAT_012</CON_REPEAT_01>
<CON_REPEAT_02>CON_REPEAT_022</CON_REPEAT_02>
<CON_REPEAT_03>CON_REPEAT_032</CON_REPEAT_03>
</CON_REPEAT>
<CON_REPEAT>
<CON_REPEAT_01>CON_REPEAT_013</CON_REPEAT_01>
<CON_REPEAT_02>CON_REPEAT_023</CON_REPEAT_02>
<CON_REPEAT_03>CON_REPEAT_033</CON_REPEAT_03>
</CON_REPEAT>
<CON_REPEAT>
<CON_REPEAT_01>CON_REPEAT_014</CON_REPEAT_01>
<CON_REPEAT_02>CON_REPEAT_024</CON_REPEAT_02>
<CON_REPEAT_03>CON_REPEAT_034</CON_REPEAT_03>
</CON_REPEAT>
<CON_REPEAT>
<CON_REPEAT_01>CON_REPEAT_015</CON_REPEAT_01>
<CON_REPEAT_02>CON_REPEAT_025</CON_REPEAT_02>
<CON_REPEAT_03>CON_REPEAT_035</CON_REPEAT_03>
</CON_REPEAT>
</ROOT>