Abap - 遍历xml文档的整个节点?

时间:2011-10-04 11:18:57

标签: xml abap dom-traversal

我想遍历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>等。

提前致谢

此致 亚历

5 个答案:

答案 0 :(得分:4)

第一步是按如下方式解析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查询。

答案 1 :(得分:2)

您可以找到extensive XML manual on SAP's documentation website(如果链接无法正常工作,请转到help.sap.com上的NetWeaver开发人员指南并搜索“xml库”。)

“iXML ABAP Objects Jumpstart”一章可以让您快速入门。 “迭代完整的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.

答案 2 :(得分:1)

我希望以下示例可以澄清情况:

 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.

享受, 亚历山大。

答案 3 :(得分:0)

手动xml遍历在更改环境中容易出错且复杂。您可能想要检查是否确实需要直接代码遍历。

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

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

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

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

答案 4 :(得分:-1)

您可以使用任何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
}