ABAP Запрос файла XML с xpath - PullRequest
       7

ABAP Запрос файла XML с xpath

1 голос
/ 03 марта 2020

Моя цель - запросить документ XML по XPath. Я не смог найти вариант сделать это с помощью if_ixml framework. Я нашел эту статью (к сожалению, на немецком языке) о запросе файла XSLT с помощью XPath с использованием CL_XSLT_PROCESSOR, но, похоже, это больше не работает, кажется, что проблема ->run( space ), и я получить этот короткий дамп с сообщением:

Не предоставлена ​​действительная программа XSLT

Даже при попытке использовать класс-оболочку CL_PROXY_XPATH в приведенном ниже коде, я получаю такой же короткий dump.

Такое ощущение, что должен быть класс, чтобы сделать именно это.

DATA(s) = |<?xml version="1.0" encoding="UTF-8"?><codedb><cl id="3">|
       && |<enumeration value="AAA"/><enumeration value="AAB"/><enumeration value="AAC"/>|
       && |<enumeration value="AAD"/><enumeration value="AAE"/>|
       && |</cl></codedb>|.

data(xpp) = new cl_proxy_xpath( ).
xpp->set_source_string( s ).
xpp->run( expression = '//cl[@id=3]/enumeration[@value=$codeValue3]' ).     "<== SHORTDUMP
data(nodes) = xpp->get_nodes( ).
"Calculate all values from the nodes
data(node) = nodes->get_next( ).
while node is bound.
    write: / node->get_value( ).
    node = nodes->get_next( ).
endwhile.

1 Ответ

1 голос
/ 03 марта 2020

В вашем коде есть две проблемы:

  • Во-первых, ваше XPath-выражение содержит $codeValue3, что приводит к короткому дампу No valid XSLT program supplied.
  • Одна из узел в ваших входных данных XML, <enumeration value="AAC"/>, который содержит пустое «текстовое значение» (не содержит атрибутов), поэтому метод get_value возвращает пустое значение.

Когда это исправлено, CL_XSLT_PROCESSOR и CL_PROXY_XPATH должны нормально работать.

Вот рабочий код, протестированный в ABAP 7.52, один с CL_PROXY_XPATH и один с CL_XSLT_PROCESSOR:

DATA(s) = |<?xml version="1.0" encoding="UTF-8"?><codedb><cl id="3">|
       && |<enumeration value="AAA"/><enumeration value="AAB"/>|
       && |<enumeration value="AAC">AAC value</enumeration>|          "<====
       && |<enumeration value="AAD"/><enumeration value="AAE"/>|
       && |</cl></codedb>|.
DATA(expression) = `//cl[@id=3]/enumeration[@value="AAC"]`.

WRITE: / 'CL_PROXY_XPATH:'.
DATA(xpp) = NEW cl_proxy_xpath( ).
xpp->set_source_string( s ).
DATA(nodes) = xpp->get_nodes( expression = expression ).
DATA(node) = nodes->get_next( ).
WHILE node IS BOUND.
  WRITE node->get_value( ). " Get text value of node (not attributes)
  node = nodes->get_next( ).
ENDWHILE.

WRITE: / 'CL_XSLT_PROCESSOR:'.
DATA(xpp2) = NEW cl_xslt_processor( ).
xpp2->set_source_string( s ).
xpp2->set_expression( expression = expression ).
xpp2->run( ' ' ).
DATA(nodes2) = xpp2->get_nodes( ).
DO nodes2->get_length( ) TIMES.
  DATA(node2) = nodes2->get_item( sy-index - 1 ).
  WRITE node2->get_value( ).
ENDDO.

Выход:

CL_PROXY_XPATH: AAC value
CL_XSLT_PROCESSOR: AAC value
...