ABAP使用xpath查询XML文件

隐秘

我的目标是通过XPath查询XML文档。我找不到使用该if_ixml框架执行此操作的选项我已经找到了这篇文章(使用德语是在德语中),有关使用XPath使用XPath查询XSLT文件,CL_XSLT_PROCESSOR但这似乎不再起作用,这似乎->run( space )是问题所在,并且出现了以下简短转储消息:

没有提供有效的XSLT程序

即使在CL_PROXY_XPATH下面的代码中尝试使用包装器类,我也会得到同样的简短转储。

感觉好像必须有一个类才能做到这一点。

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.
桑德拉·罗西(Sandra Rossi)

您的代码中有两个问题:

  • 一种是您的XPath表达式包含$codeValue3将导致No valid XSLT program supplied短暂的转储。
  • 一种是由于输入XML中的节点所致,该节点<enumeration value="AAC"/>包含一个空的“文本值”(不包含属性),因此该方法get_value返回一个空值。

当它的修正,都CL_XSLT_PROCESSORCL_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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章