На ABAP уровне XML документы обычно не содержат разделители между тэгами, т.е. содержимое XML представлено в виде одной строки. Это не мешает работать программе, но если потребуется вывести XML на просмотр или сохранить в файл, то он будет не читаемый. Повысить читаемость можно если каждый новый тэг писать на новой строке и делать отступ, соответствующий уровню иерархии тэга. Ниже представлен код, который делает структурную печать XML строки.
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
*&---------------------------------------------------------------------* *& Report ZPRETTY_PRINT_XML *& Структурная печать XML документа *&---------------------------------------------------------------------* *& Сайт программы: http://abap4.ru/?p=830 *& Разработчик: admin@abap4.ru *&---------------------------------------------------------------------* REPORT zpretty_print_xml. CLASS lcl_xml DEFINITION. PUBLIC SECTION. CLASS-METHODS pretty_print IMPORTING iv_xml TYPE string RETURNING VALUE(rv_xml) TYPE string. ENDCLASS. CLASS lcl_xml IMPLEMENTATION. METHOD pretty_print. DATA(lo_ixml) = cl_ixml=>create( ). DATA(lo_document) = lo_ixml->create_document( ). DATA(lo_factory) = lo_ixml->create_stream_factory( ). DATA(lo_istream) = lo_factory->create_istream_string( iv_xml ). DATA(lo_parser) = lo_ixml->create_parser( stream_factory = lo_factory istream = lo_istream document = lo_document ). IF lo_parser->parse( ) NE 0. DATA(lo_parse_error) = lo_parser->get_error( index = 0 ). RAISE EXCEPTION TYPE cx_ixml_parse_error EXPORTING textid = cx_ixml_parse_error=>cx_ixml_parse_error reason = lo_parse_error->get_reason( ) line = lo_parse_error->get_line( ) column = lo_parse_error->get_column( ). ENDIF. DATA(lv_xstring) = VALUE xstring( ). DATA(lo_ostream) = lo_factory->create_ostream_xstring( lv_xstring ). DATA(lo_renderer) = lo_ixml->create_renderer( document = lo_document ostream = lo_ostream ). lo_ostream->set_pretty_print( abap_true ). lo_renderer->render( ). rv_xml = cl_abap_codepage=>convert_from( lv_xstring ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. PERFORM main. FORM main. DATA lv_source_xml TYPE string. DATA lv_beauty_xml TYPE string. SELECT SINGLE * INTO @DATA(ls_data) FROM spfli. CALL TRANSFORMATION id SOURCE model = ls_data RESULT XML lv_source_xml. lv_beauty_xml = lcl_xml=>pretty_print( lv_source_xml ). WRITE / 'Исходный XML' COLOR COL_POSITIVE. PERFORM write_xml USING lv_source_xml. SKIP. WRITE / 'Форматированный XML' COLOR COL_POSITIVE. PERFORM write_xml USING lv_beauty_xml. SKIP. ENDFORM. FORM write_xml USING iv_xml TYPE string. SPLIT iv_xml AT cl_abap_char_utilities=>newline INTO TABLE DATA(lt_lines). LOOP AT lt_lines INTO DATA(lv_line). WHILE strlen( lv_line ) GT 100. WRITE / lv_line(100). lv_line = lv_line+100. ENDWHILE. WRITE / lv_line. ENDLOOP. ENDFORM. |
Результат работы программы
Присоединиться к обсуждению...