Leer XML en ABAP

Para leer un xml en ABAP, podemos usar la clase cl_xml_document.

El primer paso es declarar e instanciar la clase cl_xml_document.

ABAP
  1. <br />
  2. DATA: xml TYPE REF TO cl_xml_document.<br />
  3. CREATE OBJECT xml.<br />
Parsed in 0.034 seconds at 2.16 KB/s, using GeSHi 1.0.9.0

Luego, podemos cargar el xml desde un string, usamos el método parse_string.

ABAP
  1. <br />
  2. * primero cargamos el xml dentro de una variable string.<br />
  3. DATA: xml_str TYPE string,<br />
  4.       retcode TYPE sysubrc.<br />
  5. xml_str = &#8216;<?xml version="1.0" encoding="ISO-8859-1"?><Data><Code>0</Code><Message>Successful message</Message></Data>&#8216;.</p>
  6. <p>* El método parse_string permite cargar un string,<br />
  7. * este método devuelve un código para indicar el estado de carga.<br />
  8. retcode = xml->parse_string( xml_str ).<br />
Parsed in 0.036 seconds at 12.30 KB/s, using GeSHi 1.0.9.0

pero, si necesitamos cargar un xml desde un archivo, usamos el metodo import_from_file.

ABAP
  1. <br />
  2. * necesitamos primero tener seleccionado el archivo, previamente.<br />
  3. DATA: xml_file TYPE localfile.</p>
  4. <p>* El método import_from_file permite cargar desde un archivo local,<br />
  5. * este método devuelve un código para indicar el estado de carga.<br />
  6. retcode = xml->import_from_file( xml_file ).<br />
Parsed in 0.034 seconds at 8.95 KB/s, using GeSHi 1.0.9.0

Ahora, la pregunta es, podemos obtener un valor de un nodo especifico, well to this we can use the find_node method.

ABAP
  1. <br />
  2. DATA: specific_node TYPE REF TO if_ixml_node,<br />
  3.       specific_value TYPE string.</p>
  4. <p>specific_node = xml->find_node( name = &#8216;Message&#8217;).<br />
  5. specific_value = specific_node->get_value( ).<br />
Parsed in 0.035 seconds at 6.22 KB/s, using GeSHi 1.0.9.0

Si necesitamos leer todos los campos del xml, podemos usar el siguiente código.

ABAP
  1. <br />
  2. DATA: v_node TYPE REF TO if_ixml_node,<br />
  3.       v_iterator TYPE REF TO if_ixml_node_iterator,<br />
  4.       v_name TYPE string,<br />
  5.       v_value TYPE string.</p>
  6. <p>* primero obtenemos el primero nodo &#8220;root&#8221;.<br />
  7. v_node = xml->m_document.<br />
  8. * creamos un iterador para recorrer todos los nodos.<br />
  9. v_iterator = v_node->create_iterator( ).</p>
  10. <p>v_node = v_iterator->get_next( ).<br />
  11. * Recorremos hasta que no haya mas nodos.<br />
  12. WHILE NOT v_node IS INITIAL.</p>
  13. <p>  CASE v_node->get_type( ).<br />
  14.     WHEN if_ixml_node=>co_node_element.<br />
  15.       v_name = v_node->get_name( ).<br />
  16.       WRITE: /, v_name.<br />
  17.     WHEN if_ixml_node=>co_node_text OR if_ixml_node=>co_node_cdata_section.<br />
  18. *   text node<br />
  19.       v_value = v_node->get_value( ).<br />
  20.       WRITE: /, v_name.<br />
  21.       WRITE: /, v_value.<br />
  22.   ENDCASE.</p>
  23. <p>*   avanzamos al siguiente nodo<br />
  24.   v_node = v_iterator->get_next( ).<br />
  25. ENDWHILE.<br />
Parsed in 0.043 seconds at 22.14 KB/s, using GeSHi 1.0.9.0

y, el método siguiente, es usado para mostrar el xml.

ABAP
  1. <br />
  2. xml->display( ).<br />
Parsed in 0.033 seconds at 886 B/s, using GeSHi 1.0.9.0
.

Leave a Reply

Your email address will not be published. Required fields are marked *