繁体   English   中英

遍历一个 XML 文档的所有节点?

[英]Traverse all the nodes of an XML document?

我想遍历 if_ixml_document 的整个节点。 这是最好的方法吗?

请查找示例文档。

<text>
    <id>
         <guid auto="false">
               432543254543
         </guid>
    </id>
     <title>
         <short_title italics="on">
                <bold language = "german">
                     "Hello"
               </bold>
        </short_title>
     </title> </text>

在本文档中,我需要遍历节点<text>, <id>, <guid> , <title>, <short_title>, <bold>等。

提前致谢

问候,亚历克斯

第一步是按如下方式解析您的 XML。 您当然可以将文件中的 XML 上传到字符串中,但这只是一个示例:

data: lr_xml type ref to cl_xml_document.
data: lr_node type ref to if_ixml_node.
data: lv_xml type string.

lv_xml = '<text> <id> <guid auto="false"> 432543254543 </guid> </id> <title> <short_title italics="on"> <bold language = "german"> "Hello"</bold> </short_title> </title> </text>'.

create object lr_xml.

lr_xml->parse_string( lv_xml ).
lr_node = lr_xml->get_first_node( ).

现在您有一个指向 XML 文档根的 IF_XML_NODE 实例。 您现在可以使用各种方法来遍历 XML 树,并使用各种方法(例如 GET_CHILDREN、GET_ATTRIBUTES、GET_NAME 等)从中获取值。

这对于相当小的 XML 文档来说是可以的,但为了效率,如果您正在寻找一组特定的节点,您可能需要查看使用 XPATH 查询。

您可以在 SAP 的文档网站上找到详尽的 XML 手册(如果链接无法正常工作,请转到help.sap.com上的 NetWeaver 开发人员指南并搜索“xml 库”)。

“iXML ABAP 对象快速入门”一章应该能让您快速入门。 “迭代完整的 DOM 树”段落提供了以下示例代码:

data: iterator type ref to if_ixml_node_iterator,
      node     type ref to if_ixml_node.
iterator = document->create_iterator( ).
node = iterator->get_next( ).
while not node is initial.
  * do something with the node
  ...
  node = iterator->get_next( ).
endwhile.

我希望下面的例子可以说明情况:

 DATA: lcl_xml_doc TYPE REF TO cl_xml_document,
          lf_node TYPE REF TO if_ixml_node,
          lf_value TYPE string,
          i_xml type string,
          lf_name TYPE string,
      i_xml = 'PUT your XML HERE'.
      CREATE OBJECT lcl_xml_doc.
      IF lcl_xml_doc IS BOUND.
        IF lcl_xml_doc->parse_string( i_xml ) EQ 0.
          lf_node = lcl_xml_doc->m_document.
          IF  lf_node IS NOT INITIAL. 
            lf_iterator = lf_node->create_iterator( ).
            lf_node = lf_iterator->get_next( ).
            WHILE NOT lf_node IS INITIAL.
              lf_name = lf_node->get_name( ).
              lf_value = lf_node->get_value( ).
              IF lf_name = 'text'.
               " do something for text
               ENDIF.
              ENDIF.
              lf_node = lf_iterator->get_next( ).
            ENDWHILE.
        ENDIF.

享受吧,亚历山大。

手动 xml 遍历在不断变化的环境中容易出错且复杂。 您可能想要检查是否真的需要直接代码遍历。

在 (XSLT) 转换的帮助下,您可以将 XML 转换为 ABAP 结构化类型。 支持 XPath。

转换的声明、测试和调试是使用由事务STRANS打开的转换编辑器完成的。

XSLT 可用作转换类型: ABAP XSLT Transformation

在您的 ABAP 代码中,您只需调用语言元素CALL TRANSFORMATION ,然后数据就可以在您的目标结构中进行处理: ABAP 语句:'CALL TRANSFORMATION'

您可以使用应该由任何 DOM 库实现的DocumentTraversal接口(Xerces 有):

Document doc = ...;
NodeIterator i = ((DocumentTraversal) doc).createNodeIterator(doc, 
       NodeFilter.SHOW_ELEMENT, null, false);
Element e = null;
while ((e = (Element) i.nextNode()) != null) {
    // do stuff with element
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM