Причина в том, что вы используете коллекцию узлов, которые соответствуют всем элементам XML с именем Totales
, поэтому ваша коллекция содержит только один узел, и итератор будет выполнять итерацию только одного узла.Метод get_value
объединяет все тексты узла и его дочерних узлов на всех уровнях глубины.
Вместо этого не используйте коллекцию, получите элемент с именем Totales
, создайте итератор наэтот узел, который будет перебирать этот узел и его дочерние узлы.
Более того, узлы могут быть как элементами, так и текстами (и, возможно, другими типами, такими как атрибуты и т. д.). Для <name>value</name>
существует два узла, одинэлемента типа (имя) и элемента типа текст (значение).Это полезно для обработки потоков XML, например, <a>v1<b>v2</b>v3</a>
.Таким образом, для обработки только форм, таких как <name>value</name>
, вам нужно выбрать узлы, содержащие ровно один дочерний элемент, являющийся текстовым узлом.
DATA(lo_elem) = CAST if_ixml_node( lo_doc->find_from_path( path = '/Body/Totales' ) ).
IF lo_elem IS BOUND.
DATA(lo_iterator) = lo_elem->create_iterator( ).
DATA(lo_node) = lo_iterator->get_next( ). " get /Body/Totales node
WHILE NOT lo_node IS INITIAL.
" Only nodes of the form `<name>value</name>`
IF lo_node->get_type( ) = lo_node->co_node_element
AND lo_node->get_children( )->get_length( ) = 1
AND lo_node->get_first_child( )->get_type( ) = lo_node->co_node_text.
DATA(lf_name) = lo_node->get_name( ).
DATA(lf_value) = lo_node->get_value( ).
"do something for text
WRITE /: lf_name , lf_value.
ENDIF.
lo_node = lo_iterator->get_next( ).
ENDWHILE.
ENDIF.
Результат:
MntNeto
63934
TasaIVA
19
MntTotal
76081