Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
遍历XML文档的所有节点?_Xml_Abap_Dom Traversal - Fatal编程技术网

遍历XML文档的所有节点?

遍历XML文档的所有节点?,xml,abap,dom-traversal,Xml,Abap,Dom Traversal,我想遍历if_ixml_文档的整个节点。哪种方法最好 请找到样本文件 <text> <id> <guid auto="false"> 432543254543 </guid> </id> <title> <short_title italics="on"> <bold

我想遍历if_ixml_文档的整个节点。哪种方法最好

请找到样本文件

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

432543254543
“你好”
在本文档中,我需要遍历节点
,,

提前谢谢

问候,,
Alex

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


第一步是按如下方式解析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( ).
data:lr\u xml类型引用到cl\u xml\u文档。
数据:lr_节点类型参照if_ixml_节点。
数据:lv_xml类型字符串。
lv_xml='432543254543“你好”。
创建对象lr_xml。
lr_xml->解析_字符串(lv_xml)。
lr\u node=lr\u xml->get\u first\u node()。
现在您有了一个IF_XML_节点实例,它指向XML文档的根。现在,您可以使用各种方法遍历XML树,并从中获取值,使用各种方法,如get_子级、get_属性、get_名称等

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

您可以找到一个(如果链接无法正常工作,请转到上的《NetWeaver开发人员指南》并搜索“XML库”)

“iXML ABAP对象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.

我希望下面的例子能够澄清这种情况:

 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.
享受,
Alexander。

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

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

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

XSLT可用作转换类型:

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

该问题被标记为ABAP问题,因此我假设它适用于ABAP语言。也许@user871912可以确认一下。@mydoghasworms。授予。事实证明,ABAP支持相同的接口,尽管语法略有不同:-)非常感谢您的回复。首先,我不是在寻找任何特定的节点集。我正在编写一个非常通用的方法,比如在某些条件下更改所有元素的属性值。从这段代码中,我肯定会得到根节点。但是如果我使用像get_children这样的方法,那么之后,我将只获取根节点的直接子节点。在示例文档中,我将得到元素,但我不会得到这些元素中的子元素。我正在寻找一种可以遍历文档中整个元素的方法。正确,它只提供直接子元素。您需要做的是编写一个递归子例程来遍历整个文档。我希望很快有时间给你举个例子。
 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.