SAP ABAP:读取 XML-文档时忽略命名空间
SAP ABAP: ignore namespaces when reading an XML-Document
以下问题:我有一份 XML-文档,我将使用 SAP ABAP 阅读该文档。
看起来像这样:
<n0: someName >
<n0: someOtherName >
<n1: underName />
<n16: underUnderStuff />
</n0: someName>
</n0: someOtherName>
所以问题似乎出在 n0、n1 等。我已将它们删除以进行测试并且有效。在 ABAP 中使用 find_note 时,程序只能读取第一行。当搜索例如第二个它不会工作。
有谁知道如何忽略 n0 等?片段请。
您可以使用 ABAP 中的 XPath 功能通过名称、值等查找元素 CL_XSLT_PROCESSOR。
REPORT zmky_xml_localname.
DATA: lv_string TYPE string,
lv_xstring TYPE xstring,
lv_document TYPE REF TO if_ixml_document,
lo_processor TYPE REF TO cl_xslt_processor,
lo_nodes TYPE REF TO if_ixml_node_collection,
lo_node TYPE REF TO if_ixml_node,
lv_i TYPE i.
CONCATENATE
'<n0:someName xmlns:ns0="http://ns0">'
'<n0:someOtherName>'
'<n1:underName xmlns:ns0="http://ns1"/>'
'<n16:underUnderStuff xmlns:ns0="http://ns16">underUnderStuffValue</n16:underUnderStuff>'
'</n0:someName>'
'</n0:someOtherName>'
INTO lv_string.
lv_xstring = cl_proxy_service=>cstring2xstring( lv_string ).
CALL FUNCTION 'SDIXML_XML_TO_DOM'
EXPORTING
xml = lv_xstring
IMPORTING
document = lv_document
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
CREATE OBJECT lo_processor.
lo_processor->set_source_node( node = lv_document ).
lo_processor->set_expression( expression = '//*[local-name()="underUnderStuff"]' ).
lo_processor->run( progname = space ).
lo_nodes = lo_processor->get_nodes( ).
CHECK lo_nodes IS NOT INITIAL.
lv_i = lo_nodes->get_length( ).
WRITE: 'Item count: ', lv_i.
CHECK lv_i IS NOT INITIAL.
lo_node = lo_nodes->get_item( index = 0 ).
CHECK lo_node IS NOT INITIAL.
lv_string = lo_node->get_value( ).
WRITE /: lv_string.
以下问题:我有一份 XML-文档,我将使用 SAP ABAP 阅读该文档。 看起来像这样:
<n0: someName >
<n0: someOtherName >
<n1: underName />
<n16: underUnderStuff />
</n0: someName>
</n0: someOtherName>
所以问题似乎出在 n0、n1 等。我已将它们删除以进行测试并且有效。在 ABAP 中使用 find_note 时,程序只能读取第一行。当搜索例如第二个它不会工作。 有谁知道如何忽略 n0 等?片段请。
您可以使用 ABAP 中的 XPath 功能通过名称、值等查找元素 CL_XSLT_PROCESSOR。
REPORT zmky_xml_localname.
DATA: lv_string TYPE string,
lv_xstring TYPE xstring,
lv_document TYPE REF TO if_ixml_document,
lo_processor TYPE REF TO cl_xslt_processor,
lo_nodes TYPE REF TO if_ixml_node_collection,
lo_node TYPE REF TO if_ixml_node,
lv_i TYPE i.
CONCATENATE
'<n0:someName xmlns:ns0="http://ns0">'
'<n0:someOtherName>'
'<n1:underName xmlns:ns0="http://ns1"/>'
'<n16:underUnderStuff xmlns:ns0="http://ns16">underUnderStuffValue</n16:underUnderStuff>'
'</n0:someName>'
'</n0:someOtherName>'
INTO lv_string.
lv_xstring = cl_proxy_service=>cstring2xstring( lv_string ).
CALL FUNCTION 'SDIXML_XML_TO_DOM'
EXPORTING
xml = lv_xstring
IMPORTING
document = lv_document
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
CREATE OBJECT lo_processor.
lo_processor->set_source_node( node = lv_document ).
lo_processor->set_expression( expression = '//*[local-name()="underUnderStuff"]' ).
lo_processor->run( progname = space ).
lo_nodes = lo_processor->get_nodes( ).
CHECK lo_nodes IS NOT INITIAL.
lv_i = lo_nodes->get_length( ).
WRITE: 'Item count: ', lv_i.
CHECK lv_i IS NOT INITIAL.
lo_node = lo_nodes->get_item( index = 0 ).
CHECK lo_node IS NOT INITIAL.
lv_string = lo_node->get_value( ).
WRITE /: lv_string.