2011-10-04 91 views
5

我想遍历if_ixml_document的整个节点。这是做到这一点的最佳方式?Abap - 遍历xml文档的整个节点?

请找到示例文档。

<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>

在此先感谢穿越

问候, 亚历

回答

2

您可以找到一个extensive XML manual on SAP's documentation website(如果链接无法正常工作,请转至NetWeaver开发人员指南help.sap.com并搜索'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. 
-1

可以使用DocumentTraversal接口应实现由任何DOM库(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 
} 
+0

的问题是标记为ABAP问题,所以我认为它是针对ABAP语言的。也许@ user871912可以确认。 – mydoghasworms

+0

@mydoghasworms。理所当然的。但事实证明,ABAP支持相同的接口,尽管其语法略有不同:-) –

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查询。

+0

非常感谢回复。首先,我没有寻找任何特定的节点集。我正在编写一个非常通用的方法,比如在某些条件下更改所有元素的属性值。从这段代码中,我一定会得到根节点。但比如果我使用像get_children这样的方法后,我将只获得根节点的直接子节点。在示例文档中,我将获得元素,但我不会在那些内部获取孩子。我正在寻找一种可以遍历文档中所有元素的方法。 – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/871912/">Alex</a></span> <span></span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+1</span></div> <div class="col-lg-11"> <p class="commenttext">正确,它只会给你直接的孩子。你需要做的是写一个递归子程序来遍历整个文档。我希望能尽快给你一个例子。 – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/274354/">mydoghasworms</a></span> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">1<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p>我希望下面的例子可以说明情况:</p> <pre><code class="prettyprint-override">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. </code></pre> <p>享受, 亚历山大。</p> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/7660171">来源</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2011-10-05 10:52:42</span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> </div> </article> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="4319274062" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">0<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p>手动xml遍历在变化的环境中容易出错并且很复杂。你可能想要检查你是否真的需要直接的代码遍历。</p> <p>借助(XSLT)转换,您可以将XML转换为ABAP结构化类型。 XPath受支持。</p> <p>转换的声明,测试和调试是使用由事务<code class="prettyprint-override">STRANS</code>打开的转换编辑器完成的。</p> <p>XSLT可以作为转换类型: <a href="http://help.sap.com/abapdocu_70/en/ABENABAP_XSLT.htm" rel="nofollow">ABAP XSLT Transformation</a></p> <p>在您的ABAP代码,您将只需要调用语言元素<code class="prettyprint-override">CALL TRANSFORMATION</code>和数据准备在你的目标结构事后处理: <a href="http://help.sap.com/abapdocu_70/en/ABAPCALL_TRANSFORMATION.htm" rel="nofollow">ABAP Statement: 'CALL TRANSFORMATION'</a></p> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/8794993">来源</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2012-01-09 20:47:32</span> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/1098409/">Eric</a></span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> </div> </article> </div> <div class="clearfix"> </div> <div class="relative-box"> <div class="relative">相关问题</div> <ul class="relative_list"> <li> 1. <a href="http://cn.voidcc.com/question/p-ubuvjeqv-cr.html" target="_blank" title="AS3 XML节点遍历"> AS3 XML节点遍历 </a> </li> <li> 2. <a href="http://cn.voidcc.com/question/p-kwxpdnli-hp.html" target="_blank" title="不能遍历XML文档"> 不能遍历XML文档 </a> </li> <li> 3. <a href="http://cn.voidcc.com/question/p-tbsxwklb-sd.html" target="_blank" title="PowerShell的XML - 遍历,父节点"> PowerShell的XML - 遍历,父节点 </a> </li> <li> 4. <a href="http://cn.voidcc.com/question/p-cxjzxgjm-sr.html" target="_blank" title="AS3 XML:广东话遍历节点"> AS3 XML:广东话遍历节点 </a> </li> <li> 5. <a href="http://cn.voidcc.com/question/p-dvavjpib-bw.html" target="_blank" title="使用XML遍历节点:: LibXML"> 使用XML遍历节点:: LibXML </a> </li> <li> 6. <a href="http://cn.voidcc.com/question/p-qnqhrfyz-cu.html" target="_blank" title="使用MSXML在Xml节点遍历"> 使用MSXML在Xml节点遍历 </a> </li> <li> 7. <a href="http://cn.voidcc.com/question/p-dpivorra-gw.html" target="_blank" title="使用vbscript遍历XML节点"> 使用vbscript遍历XML节点 </a> </li> <li> 8. <a href="http://cn.voidcc.com/question/p-dnqsllyd-gw.html" target="_blank" title="如何遍历HTML文档中的XML?"> 如何遍历HTML文档中的XML? </a> </li> <li> 9. <a href="http://cn.voidcc.com/question/p-vlysrirk-mp.html" target="_blank" title="的LINQ to XML文档遍历"> 的LINQ to XML文档遍历 </a> </li> <li> 10. <a href="http://cn.voidcc.com/question/p-bjhivimd-qe.html" target="_blank" title="java中的XML文档遍历"> java中的XML文档遍历 </a> </li> <li> 11. <a href="http://cn.voidcc.com/question/p-fcmqhfba-hg.html" target="_blank" title="XSL节点遍历"> XSL节点遍历 </a> </li> <li> 12. <a href="http://cn.voidcc.com/question/p-uspvtrhh-ms.html" target="_blank" title="遍历AST节点"> 遍历AST节点 </a> </li> <li> 13. <a href="http://cn.voidcc.com/question/p-qkdcwmuu-ed.html" target="_blank" title="ANTLR - 遍历节点"> ANTLR - 遍历节点 </a> </li> <li> 14. <a href="http://cn.voidcc.com/question/p-numoaytm-my.html" target="_blank" title="Java:JGraphT:遍历节点"> Java:JGraphT:遍历节点 </a> </li> <li> 15. <a href="http://cn.voidcc.com/question/p-munxxrbc-st.html" target="_blank" title="Networkx节点遍历"> Networkx节点遍历 </a> </li> <li> 16. <a href="http://cn.voidcc.com/question/p-slimvyzx-os.html" target="_blank" title="如何在Delphi中使用NativeXML来遍历XML文档中的类似节点?"> 如何在Delphi中使用NativeXML来遍历XML文档中的类似节点? </a> </li> <li> 17. <a href="http://cn.voidcc.com/question/p-zwqhgund-dg.html" target="_blank" title="的XMLReader遍历节点"> 的XMLReader遍历节点 </a> </li> <li> 18. <a href="http://cn.voidcc.com/question/p-chkimcou-ku.html" target="_blank" title="vbscript遍历xml节点 - 动态if else,节点数检测"> vbscript遍历xml节点 - 动态if else,节点数检测 </a> </li> <li> 19. <a href="http://cn.voidcc.com/question/p-yepapzuo-pb.html" target="_blank" title="使用VBScript遍历XML文件中的所有节点"> 使用VBScript遍历XML文件中的所有节点 </a> </li> <li> 20. <a href="http://cn.voidcc.com/question/p-ahmvgyrr-km.html" target="_blank" title="从一个节点遍历XML到另一个使用Python"> 从一个节点遍历XML到另一个使用Python </a> </li> <li> 21. <a href="http://cn.voidcc.com/question/p-hjkcftny-cv.html" target="_blank" title="通过从jQuery的XML节点遍历每个"> 通过从jQuery的XML节点遍历每个 </a> </li> <li> 22. <a href="http://cn.voidcc.com/question/p-yaiadvnn-dn.html" target="_blank" title="XSLT - 遍历节点集"> XSLT - 遍历节点集 </a> </li> <li> 23. <a href="http://cn.voidcc.com/question/p-vuwrfyth-eq.html" target="_blank" title="HTMLAgilityPack只遍历所有文本节点"> HTMLAgilityPack只遍历所有文本节点 </a> </li> <li> 24. <a href="http://cn.voidcc.com/question/p-qwydzfab-gm.html" target="_blank" title="XSLT for each,遍历文本和节点"> XSLT for each,遍历文本和节点 </a> </li> <li> 25. <a href="http://cn.voidcc.com/question/p-qmilubzv-gx.html" target="_blank" title="通过xpath遍历一个未知的xml文档"> 通过xpath遍历一个未知的xml文档 </a> </li> <li> 26. <a href="http://cn.voidcc.com/question/p-qgcwtzok-sg.html" target="_blank" title="XML文档有多少个父节点?"> XML文档有多少个父节点? </a> </li> <li> 27. <a href="http://cn.voidcc.com/question/p-hgxpcobx-hn.html" target="_blank" title="访问单个XML DOM文档节点"> 访问单个XML DOM文档节点 </a> </li> <li> 28. <a href="http://cn.voidcc.com/question/p-qfnnzizu-vt.html" target="_blank" title="遍历整个div"> 遍历整个div </a> </li> <li> 29. <a href="http://cn.voidcc.com/question/p-usmztcgv-gr.html" target="_blank" title="XML遍历,复制单元和节点使用LINQ to XML"> XML遍历,复制单元和节点使用LINQ to XML </a> </li> <li> 30. <a href="http://cn.voidcc.com/question/p-azmambun-du.html" target="_blank" title="Neo4J节点遍历密码每个节点的where子句"> Neo4J节点遍历密码每个节点的where子句 </a> </li> </ul> </div> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3534119089"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img2.voidcc.com/voidso/script/side.js?t=1652515421853"></script> <script type="text/javascript" src="http://img2.voidcc.com/voidso/plugin/highlight/highlight.pack.js"></script> <link href="http://img2.voidcc.com/voidso/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 每日一句 </div> <div class="panel-body m-b-sm m-t-sm clearfix"> 每一个你不满意的现在,都有一个你没有努力的曾经。 </div> </div> <div class="row"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- VOIDCC问答侧边栏广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3862022848" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 最新问题 </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://cn.voidcc.com/question/p-elmhqcgi-bhu.html" target="_blank" title="STRCONV把括号作为第一个字母"> STRCONV把括号作为第一个字母 </a> </li> <li class="side_article_list_item"> 2. <a href="http://cn.voidcc.com/question/p-rprrddof-bhe.html" target="_blank" title="呼叫在C#"> 呼叫在C# </a> </li> <li class="side_article_list_item"> 3. <a href="http://cn.voidcc.com/question/p-pyosdmni-bgy.html" target="_blank" title="编辑多边形多边形的多边形路径事件"> 编辑多边形多边形的多边形路径事件 </a> </li> <li class="side_article_list_item"> 4. <a href="http://cn.voidcc.com/question/p-codtynnf-uv.html" target="_blank" title="TweenJS旋转平滑问题"> TweenJS旋转平滑问题 </a> </li> <li class="side_article_list_item"> 5. <a href="http://cn.voidcc.com/question/p-gqnerasl-va.html" target="_blank" title="Android Firebase下载声音"> Android Firebase下载声音 </a> </li> <li class="side_article_list_item"> 6. <a href="http://cn.voidcc.com/question/p-swsynjlw-va.html" target="_blank" title="无法在asp.net MVC中查看JavaScript视图MVC"> 无法在asp.net MVC中查看JavaScript视图MVC </a> </li> <li class="side_article_list_item"> 7. <a href="http://cn.voidcc.com/question/p-xfwspsmb-vb.html" target="_blank" title="将样式应用到jqgrid"> 将样式应用到jqgrid </a> </li> <li class="side_article_list_item"> 8. <a href="http://cn.voidcc.com/question/p-gusphljh-vb.html" target="_blank" title="访问查询:在不使用DSum的情况下运行总计(或另一种方法)?"> 访问查询:在不使用DSum的情况下运行总计(或另一种方法)? </a> </li> <li class="side_article_list_item"> 9. <a href="http://cn.voidcc.com/question/p-bkxfzyvy-bdn.html" target="_blank" title="我似乎在运行这部分游戏时出现了错误。除了这是一个逻辑错误,并不会在编译器中显示"> 我似乎在运行这部分游戏时出现了错误。除了这是一个逻辑错误,并不会在编译器中显示 </a> </li> <li class="side_article_list_item"> 10. <a href="http://cn.voidcc.com/question/p-schrzyhg-bho.html" target="_blank" title="用户输入文件路径"> 用户输入文件路径 </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> 相关问题</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://cn.voidcc.com/question/p-ubuvjeqv-cr.html" target="_blank" title="AS3 XML节点遍历"> AS3 XML节点遍历 </a> </li> <li class="side_article_list_item"> 2. <a href="http://cn.voidcc.com/question/p-kwxpdnli-hp.html" target="_blank" title="不能遍历XML文档"> 不能遍历XML文档 </a> </li> <li class="side_article_list_item"> 3. <a href="http://cn.voidcc.com/question/p-tbsxwklb-sd.html" target="_blank" title="PowerShell的XML - 遍历,父节点"> PowerShell的XML - 遍历,父节点 </a> </li> <li class="side_article_list_item"> 4. <a href="http://cn.voidcc.com/question/p-cxjzxgjm-sr.html" target="_blank" title="AS3 XML:广东话遍历节点"> AS3 XML:广东话遍历节点 </a> </li> <li class="side_article_list_item"> 5. <a href="http://cn.voidcc.com/question/p-dvavjpib-bw.html" target="_blank" title="使用XML遍历节点:: LibXML"> 使用XML遍历节点:: LibXML </a> </li> <li class="side_article_list_item"> 6. <a href="http://cn.voidcc.com/question/p-qnqhrfyz-cu.html" target="_blank" title="使用MSXML在Xml节点遍历"> 使用MSXML在Xml节点遍历 </a> </li> <li class="side_article_list_item"> 7. <a href="http://cn.voidcc.com/question/p-dpivorra-gw.html" target="_blank" title="使用vbscript遍历XML节点"> 使用vbscript遍历XML节点 </a> </li> <li class="side_article_list_item"> 8. <a href="http://cn.voidcc.com/question/p-dnqsllyd-gw.html" target="_blank" title="如何遍历HTML文档中的XML?"> 如何遍历HTML文档中的XML? </a> </li> <li class="side_article_list_item"> 9. <a href="http://cn.voidcc.com/question/p-vlysrirk-mp.html" target="_blank" title="的LINQ to XML文档遍历"> 的LINQ to XML文档遍历 </a> </li> <li class="side_article_list_item"> 10. <a href="http://cn.voidcc.com/question/p-bjhivimd-qe.html" target="_blank" title="java中的XML文档遍历"> java中的XML文档遍历 </a> </li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://cn.voidcc.com/contact">联系我们</a></li> <li>© 2020 CN.VOIDCC.COM</li> <li><a rel="nofollow" href="https://beian.miit.gov.cn/" target="_blank">沪ICP备13005482号-13</a></li> <li><script type="text/javascript" src="https://s9.cnzz.com/z_stat.php?id=1280098168&web_id=1280098168"></script></li> <li><a href="http://cn.voidcc.com/" target="_blank" title="程序问答园区">简体中文</a></li> <li><a href="http://hk.voidcc.com/" target="_blank" title="程序問答園區">繁體中文</a></li> <li><a href="http://ru.voidcc.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.voidcc.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.voidcc.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.voidcc.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.voidcc.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.voidcc.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.voidcc.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.voidcc.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.voidcc.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.voidcc.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.voidcc.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-77509369-5"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'UA-77509369-5'); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?67d4731349f0b00136755b80364ce381"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>