SAP ABAP: игнорировать пространства имен при чтении XML-документа - PullRequest
0 голосов
/ 07 марта 2019

Следующая проблема: у меня есть XML-документ, который я буду читать с SAP ABAP. Выглядит так:

<n0: someName >
<n0: someOtherName >
   <n1: underName />
      <n16: underUnderStuff />
</n0: someName>
</n0: someOtherName>

Так что, похоже, проблема в n0, n1 и т. Д. Я удалил их для тестирования, и это сработало. При использовании find_note в ABAP программа может читать только первую строку. Например, при поиске второй это не сработает. У кого-нибудь есть идеи, как игнорировать n0 и т. Д.? Отрывки пожалуйста.

1 Ответ

1 голос
/ 07 марта 2019

Вы можете использовать функциональность XPath в ABAP для поиска элементов по имени, значению и т. Д. С помощью CL_XSLT_PROCESSOR.

REPORT zmky_xml_localname.

DATA: lv_string     TYPE string,
      lv_xstring    TYPE xstring,
      lv_document   TYPE REF TO if_ixml_document,
      lo_processor  TYPE REF TO cl_xslt_processor,
      lo_nodes      TYPE REF TO if_ixml_node_collection,
      lo_node       TYPE REF TO if_ixml_node,
      lv_i          TYPE i.

CONCATENATE
  '<n0:someName xmlns:ns0="http://ns0">'
  '<n0:someOtherName>'
     '<n1:underName  xmlns:ns0="http://ns1"/>'
        '<n16:underUnderStuff xmlns:ns0="http://ns16">underUnderStuffValue</n16:underUnderStuff>'
  '</n0:someName>'
  '</n0:someOtherName>'
INTO lv_string.

lv_xstring = cl_proxy_service=>cstring2xstring( lv_string ).

CALL FUNCTION 'SDIXML_XML_TO_DOM'
  EXPORTING
    xml           = lv_xstring
  IMPORTING
    document      = lv_document
  EXCEPTIONS
    invalid_input = 1
    OTHERS        = 2.

CREATE OBJECT lo_processor.
lo_processor->set_source_node( node = lv_document ).
lo_processor->set_expression( expression = '//*[local-name()="underUnderStuff"]' ).
lo_processor->run( progname = space ).
lo_nodes = lo_processor->get_nodes( ).
CHECK lo_nodes IS NOT INITIAL.
lv_i = lo_nodes->get_length( ).
WRITE: 'Item count: ', lv_i.
CHECK lv_i IS NOT INITIAL.
lo_node = lo_nodes->get_item( index = 0 ).
CHECK lo_node IS NOT INITIAL.
lv_string = lo_node->get_value( ).
WRITE /: lv_string.
...