2011-10-04 96 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://hk.voidcc.com/question/p-ubuvjeqv-cr.html" target="_blank" title="AS3 XML節點遍歷"> AS3 XML節點遍歷 </a> </li> <li> 2. <a href="http://hk.voidcc.com/question/p-kwxpdnli-hp.html" target="_blank" title="不能遍歷XML文檔"> 不能遍歷XML文檔 </a> </li> <li> 3. <a href="http://hk.voidcc.com/question/p-tbsxwklb-sd.html" target="_blank" title="PowerShell的XML - 遍歷,父節點"> PowerShell的XML - 遍歷,父節點 </a> </li> <li> 4. <a href="http://hk.voidcc.com/question/p-cxjzxgjm-sr.html" target="_blank" title="AS3 XML:廣東話遍歷節點"> AS3 XML:廣東話遍歷節點 </a> </li> <li> 5. <a href="http://hk.voidcc.com/question/p-dvavjpib-bw.html" target="_blank" title="使用XML遍歷節點:: LibXML"> 使用XML遍歷節點:: LibXML </a> </li> <li> 6. <a href="http://hk.voidcc.com/question/p-qnqhrfyz-cu.html" target="_blank" title="使用MSXML在Xml節點遍歷"> 使用MSXML在Xml節點遍歷 </a> </li> <li> 7. <a href="http://hk.voidcc.com/question/p-dpivorra-gw.html" target="_blank" title="使用vbscript遍歷XML節點"> 使用vbscript遍歷XML節點 </a> </li> <li> 8. <a href="http://hk.voidcc.com/question/p-dnqsllyd-gw.html" target="_blank" title="如何遍歷HTML文檔中的XML?"> 如何遍歷HTML文檔中的XML? </a> </li> <li> 9. <a href="http://hk.voidcc.com/question/p-vlysrirk-mp.html" target="_blank" title="的LINQ to XML文檔遍歷"> 的LINQ to XML文檔遍歷 </a> </li> <li> 10. <a href="http://hk.voidcc.com/question/p-bjhivimd-qe.html" target="_blank" title="java中的XML文檔遍歷"> java中的XML文檔遍歷 </a> </li> <li> 11. <a href="http://hk.voidcc.com/question/p-fcmqhfba-hg.html" target="_blank" title="XSL節點遍歷"> XSL節點遍歷 </a> </li> <li> 12. <a href="http://hk.voidcc.com/question/p-uspvtrhh-ms.html" target="_blank" title="遍歷AST節點"> 遍歷AST節點 </a> </li> <li> 13. <a href="http://hk.voidcc.com/question/p-qkdcwmuu-ed.html" target="_blank" title="ANTLR - 遍歷節點"> ANTLR - 遍歷節點 </a> </li> <li> 14. <a href="http://hk.voidcc.com/question/p-numoaytm-my.html" target="_blank" title="Java:JGraphT:遍歷節點"> Java:JGraphT:遍歷節點 </a> </li> <li> 15. <a href="http://hk.voidcc.com/question/p-munxxrbc-st.html" target="_blank" title="Networkx節點遍歷"> Networkx節點遍歷 </a> </li> <li> 16. <a href="http://hk.voidcc.com/question/p-slimvyzx-os.html" target="_blank" title="如何在Delphi中使用NativeXML來遍歷XML文檔中的類似節點?"> 如何在Delphi中使用NativeXML來遍歷XML文檔中的類似節點? </a> </li> <li> 17. <a href="http://hk.voidcc.com/question/p-zwqhgund-dg.html" target="_blank" title="的XMLReader遍歷節點"> 的XMLReader遍歷節點 </a> </li> <li> 18. <a href="http://hk.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://hk.voidcc.com/question/p-yepapzuo-pb.html" target="_blank" title="使用VBScript遍歷XML文件中的所有節點"> 使用VBScript遍歷XML文件中的所有節點 </a> </li> <li> 20. <a href="http://hk.voidcc.com/question/p-ahmvgyrr-km.html" target="_blank" title="從一個節點遍歷XML到另一個使用Python"> 從一個節點遍歷XML到另一個使用Python </a> </li> <li> 21. <a href="http://hk.voidcc.com/question/p-hjkcftny-cv.html" target="_blank" title="通過從jQuery的XML節點遍歷每個"> 通過從jQuery的XML節點遍歷每個 </a> </li> <li> 22. <a href="http://hk.voidcc.com/question/p-yaiadvnn-dn.html" target="_blank" title="XSLT - 遍歷節點集"> XSLT - 遍歷節點集 </a> </li> <li> 23. <a href="http://hk.voidcc.com/question/p-vuwrfyth-eq.html" target="_blank" title="HTMLAgilityPack只遍歷所有文本節點"> HTMLAgilityPack只遍歷所有文本節點 </a> </li> <li> 24. <a href="http://hk.voidcc.com/question/p-qwydzfab-gm.html" target="_blank" title="XSLT for each,遍歷文本和節點"> XSLT for each,遍歷文本和節點 </a> </li> <li> 25. <a href="http://hk.voidcc.com/question/p-qmilubzv-gx.html" target="_blank" title="通過xpath遍歷一個未知的xml文檔"> 通過xpath遍歷一個未知的xml文檔 </a> </li> <li> 26. <a href="http://hk.voidcc.com/question/p-qgcwtzok-sg.html" target="_blank" title="XML文檔有多少個父節點?"> XML文檔有多少個父節點? </a> </li> <li> 27. <a href="http://hk.voidcc.com/question/p-hgxpcobx-hn.html" target="_blank" title="訪問單個XML DOM文檔節點"> 訪問單個XML DOM文檔節點 </a> </li> <li> 28. <a href="http://hk.voidcc.com/question/p-qfnnzizu-vt.html" target="_blank" title="遍歷整個div"> 遍歷整個div </a> </li> <li> 29. <a href="http://hk.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://hk.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=1652515421930"></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"> <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://hk.voidcc.com/question/p-rpbmmcon-kr.html" target="_blank" title="在Google Analytics中跟蹤POST內容的成功填寫表格"> 在Google Analytics中跟蹤POST內容的成功填寫表格 </a> </li> <li class="side_article_list_item"> 2. <a href="http://hk.voidcc.com/question/p-knlpcgso-tg.html" target="_blank" title="FIFO與/ dev/urandom"> FIFO與/ dev/urandom </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.voidcc.com/question/p-nnriqxkf-th.html" target="_blank" title="將劇情保存爲EMF文件"> 將劇情保存爲EMF文件 </a> </li> <li class="side_article_list_item"> 4. <a href="http://hk.voidcc.com/question/p-nmbgvmon-to.html" target="_blank" title="如何從SNMP MIB獲取ifOperStatus?"> 如何從SNMP MIB獲取ifOperStatus? </a> </li> <li class="side_article_list_item"> 5. <a href="http://hk.voidcc.com/question/p-aqtcpvyj-tq.html" target="_blank" title="在同一個表列中選擇重複的記錄並將它們列出"> 在同一個表列中選擇重複的記錄並將它們列出 </a> </li> <li class="side_article_list_item"> 6. <a href="http://hk.voidcc.com/question/p-prpnbzeh-tp.html" target="_blank" title="如何傳遞一個變量在web API"> 如何傳遞一個變量在web API </a> </li> <li class="side_article_list_item"> 7. <a href="http://hk.voidcc.com/question/p-rpybhhvj-hb.html" target="_blank" title="將數據從Access 2010導出到Excel 2013"> 將數據從Access 2010導出到Excel 2013 </a> </li> <li class="side_article_list_item"> 8. <a href="http://hk.voidcc.com/question/p-rqyduroc-cp.html" target="_blank" title="量角器和Firefox在測試時超時AngularJS"> 量角器和Firefox在測試時超時AngularJS </a> </li> <li class="side_article_list_item"> 9. <a href="http://hk.voidcc.com/question/p-ztyhnsvv-hw.html" target="_blank" title="SQL Server 2000反向工程工具"> SQL Server 2000反向工程工具 </a> </li> <li class="side_article_list_item"> 10. <a href="http://hk.voidcc.com/question/p-fxxdpqqs-bu.html" target="_blank" title="git對象文件夾權限"> git對象文件夾權限 </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://hk.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://hk.voidcc.com/question/p-kwxpdnli-hp.html" target="_blank" title="不能遍歷XML文檔"> 不能遍歷XML文檔 </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.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://hk.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://hk.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://hk.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://hk.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://hk.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://hk.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://hk.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://hk.voidcc.com/contact">聯系我們</a></li> <li>© 2020 HK.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>