ABAP 使用 xpath 查询 XML 文件
ABAP Query an XML file with xpath
我的目标是通过 XPath 查询 XML 文档。我找不到使用 if_ixml
框架执行此操作的选项。我发现这个 article(遗憾的是它是德语)关于使用 CL_XSLT_PROCESSOR
使用 XPath 查询 XSLT 文件,但这似乎不再起作用,似乎 ->run( space )
是问题所在,我得到了这个带有消息的简短转储:
No valid XSLT program supplied
即使在下面的代码中尝试使用包装器 class CL_PROXY_XPATH
,我也会得到相同的短转储。
感觉一定要有一个class才能做到这一点
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.
您的代码中有两个问题:
- 一个是您的 XPath 表达式包含
$codeValue3
,这会导致 No valid XSLT program supplied
短转储。
- 一个是由于你输入的节点XML,
<enumeration value="AAC"/>
,其中包含一个空的"text value"(不包含属性),所以方法get_value
returns 空值。
更正后,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
我的目标是通过 XPath 查询 XML 文档。我找不到使用 if_ixml
框架执行此操作的选项。我发现这个 article(遗憾的是它是德语)关于使用 CL_XSLT_PROCESSOR
使用 XPath 查询 XSLT 文件,但这似乎不再起作用,似乎 ->run( space )
是问题所在,我得到了这个带有消息的简短转储:
No valid XSLT program supplied
即使在下面的代码中尝试使用包装器 class CL_PROXY_XPATH
,我也会得到相同的短转储。
感觉一定要有一个class才能做到这一点
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.
您的代码中有两个问题:
- 一个是您的 XPath 表达式包含
$codeValue3
,这会导致No valid XSLT program supplied
短转储。 - 一个是由于你输入的节点XML,
<enumeration value="AAC"/>
,其中包含一个空的"text value"(不包含属性),所以方法get_value
returns 空值。
更正后,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