Работа с XML в ABAP

 

XML in ABAP

Работа с XML

    Расширяемый язык разметки (XML) — это метаязык разметки, который используется для определения структурированных документов, которыми можно легко обмениваться между разнородными системами. Существует много способов обмена данными между системами, но с ростом веб-сервисов XML приобрел популярность среди разработчиков. Красота XML заключается в его гибкости и простоте.

    XML определяет стандарт, который можно использовать для определения формата документов. Используя XML, мы можем структурировать и организовывать различные виды данных. Язык разметки (например, HTML) состоит из предопределенных тегов. Теги позволяют форматировать и упорядочивать данные. Теги сохраняются между символами меньше (<) и больше (>). Например, в документе HTML мы можем открыть тег абзаца с помощью <p> и закрыть его с помощью </p>. Содержимое, хранящееся между тегами, интерпретируется соответствующим образом. Здесь содержимое между <p> и </p> форматируется как абзац; содержимое между <h1> и </h1> интерпретируется как заголовок.

    Однако XML — это метаязык разметки, который определяет язык разметки. Он разработан, чтобы быть гибким и простым для понимания как для людей, так и для машин. В XML нет предопределенных тегов; любой тег может использоваться для описания содержимого.

    Мы обсудим базовый синтаксис XML и рассмотрим библиотеку iXML, предоставляемую SAP для создания XML-документов в ABAP. Понимание XML полезно при предоставлении или использовании данных во внешних приложениях.

Обзор XML

    Файлы XML обеспечивают большую гибкость для обмена структурированными документами. Поскольку предопределенных тегов нет, мы можем использовать теги, которые подходят для нашего домена и не требуют пояснений. Конечно, разработка стандарта разметки документов облегчает сторонним поставщикам разработку программного обеспечения, способного обрабатывать XML-файлы.

  Например, предположим, что у нас есть веб-сайт, который можно расширить, установив пользовательские расширения. Расширения бывают двух типов: компоненты и плагины (т. е. сайт можно расширить, разработав компонент или плагин). Мы разработали компонент и хотим загрузить файлы пользовательского компонента в виде пакета на веб-сервер. Чтобы предоставить информацию о компоненте сценарию установки, мы можем предоставить файл XML с пакетом, который содержит информацию о файловой структуре пакета, как показано ниже. Установщик может прочитать этот XML-файл и загрузить файлы пакета в указанные папки на веб-сервере.  
<?xml version="1.0" encoding="utf-8"?>
<!—This iscomment-->
<extension type="component">
<files folder="site">
<filename>index.html</filename>
<filename>site.php</filename>
</files>
<media folder="media">
<folder>css</folder>
<folder>images</folder>
<folder>js</folder>
</media>
</extension>
    Как показано в листинге 8.33, XML-документы организованы в виде набора элементов. В первой строке документа указывается версия XML и используемая кодировка. Синтаксис этого оператора: <?xml version="1.0" encoding=""?>, и он необязателен.

    Основной синтаксис для определения элемента в XML выглядит следующим образом:
<element_name attribute_name=attribute_value>
<!-- ElementContent-->
</element_name>
     В представленном XML-файле примера для тега <extension type="component"> имя элемента — расширение, имя атрибута — тип, а значение атрибута — компонент. Это сообщает скрипту загрузки, что мы пытаемся загрузить расширение, которое является компонентом. Теги <files> и <media> являются элементами родительского узла <extension>. Теги под <files> и <media> представляют собой содержимое соответствующих элементов, которое определяет папки и файлы, которые мы загружаем. Документ закрывается закрывающим тегом </extension>. 

    Комментарии могут сохраняться между <!-- и -->. XML-разметка чувствительна к регистру; например, имя элемента <ELEMENT> отличается от <element>.

Основные понятия обработки XML

    SAP NetWeaver AS ABAP предоставляет библиотеку iXML, которую можно использовать для обработки XML-файлов. Эта библиотека реализует различные интерфейсы, которые позволяют нам работать с файлами XML, вызывая различные методы. Ниже показан код для создания XML-файла с использованием библиотеки iXML. Создаваемый нами файл XML содержит данные XML выше. Мы определяем ссылочные объекты для XML-документа из библиотеки iXML. Ссылочный объект для XML-документа ссылается на интерфейс if_ixml_document, а ссылочный объект определяется для каждого элемента в XML-файле посредством ссылки на if_ixml_element. XML-файл создается путем вызова соответствующих методов из библиотеки.

*Объявления для создания XML-документа
DATA: "Ссылка на объект XML
      lo_ixml TYPE REF TO if_ixml,
      "Ссылка для XML-документа
      lo_document TYPE REF TO if_ixml_document,
      "Ссылка на элемент «расширение» в документе
      lo_extension TYPE REF TO if_ixml_element,
      "Ссылка на элемент «файлы» в документе
      lo_files TYPE REF TO if_ixml_element,
      "Ссылка на элемент «медиа» в документе
      lo_media TYPE REF TO if_ixml_element,
      "Ссылка на установку кодировки
      lo_encoding TYPE REF TO if_ixml_encoding.
*Объявления для создания выходного потока и рендеринга
* в строку xstring
DATA: lo_streamfactory TYPE REF TO if_ixml_stream_factory,
      lo_ostream       TYPE REF TO if_ixml_ostream,
      lo_renderer      TYPE REF TO if_ixml_renderer,
      lv_xml           TYPE xstring.
* Создать XML-объект
lo_ixml = cl_ixml=>create( ).
*Создать документ
lo_document = lo_ixml->create_document( ).
*Создать кодировку
lo_encoding = lo_ixml->create_encoding(
                byte_order = 0 character_set = 'UTF-8' ).
*Установить кодировку
lo_document->set_encoding( lo_encoding ).
*Создать элемент «расширение» как корень
lo_extension = lo_document->create_simple_element( name   = 'extension'
                                                   parent = lo_document ).
*Установить атрибут для элемента «расширение»
lo_extension->set_attribute( name = 'Type' value = 'Component').
*Создайте элемент «файлы» с родительским элементом «расширения»
lo_files = lo_document->create_simple_element( name   = 'files'
                                               parent = lo_extension ).
*Установить атрибут для элемента «файлы»
lo_files->set_attribute( name = 'Folder' value = 'site').
*Создать содержимое элемента
lo_document->create_simple_element( name   = 'filename'
                                    parent = lo_files
                                    value = 'index.html').

lo_document->create_simple_element( name   = 'filename'
                                    parent = lo_files
                                    value  = 'site.php').
*Создайте элемент «медиа» с элементом «расширение» в качестве родителя
lo_media = lo_document->create_simple_element( name ='media'
                                               parent = lo_extension ).
**Установить атрибут для элемента «медиа»
lo_media->set_attribute( name = 'Folder' value ='media').
*Создать содержимое элемента
lo_document->create_simple_element( name  = 'folder' parent = lo_media
                                    value = 'css').
lo_document->create_simple_element( name  = 'folder' parent = lo_media
                                    value = 'images').
lo_document->create_simple_element( name  = 'folder' parent = lo_media
                                    value = 'js').

"Создать фабрику потоков
lo_streamfactory = lo_ixml->create_stream_factory( ).
"Создать поток вывода
lo_ostream = lo_streamfactory->create_ostream_xstring( string = lv_xml ).
"Создать визуализатор
lo_renderer = lo_ixml->create_renderer( ostream  = lo_ostream 
									    document = lo_document ).
"Преобразует документ в выходной поток lv_xml
lo_renderer->render( ).
"Вывод
cl_abap_browser=>show_xml( xml_xstring = lv_xml ).

Комментарии