2011-10-04 17 views
5

Voglio attraversare tutti i nodi di un if_ixml_document. qual è il modo migliore per farlo?Abap - Attraversando tutti i nodi di un documento xml?

Si prega di trovare il documento di esempio.

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

In questo documento, ho bisogno di attraversare attraverso i nodi <text>, <id>, <guid> , <title>, <short_title>, <bold> ecc

Grazie in anticipo

saluti, Alex

risposta

2

È possibile trovare uno extensive XML manual on SAP's documentation website (nel caso in cui il collegamento non funzioni correttamente, consultare la Guida per gli sviluppatori di NetWeaver su help.sap.com e cercare "libreria xml").

Il capitolo 'Oggetti iXML ABAP Jumpstart' dovrebbe iniziare rapidamente. Il paragrafo 'scorrere il completo DOM-albero' fornisce il seguente codice di esempio:

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

È possibile utilizzare l'interfaccia DocumentTraversal che dovrebbe essere attuato da qualsiasi libreria DOM (Xerces ce l'ha):

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

La domanda è: contrassegnato come una domanda ABAP, quindi presumo che sia per la lingua ABAP. Forse @ user871912 può solo confermare. – mydoghasworms

+0

@mydoghasworms. Concesso. A quanto pare, ABAP supporta le stesse interfacce, anche se in * leggermente * sintassi diversa :-) –

4

Il primo passo è analizzare il codice XML come segue. Ovviamente si può caricare l'XML da un file nella stringa, ma questo è solo un esempio:

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(). 

Ora avete un'istanza di IF_XML_NODE che punta alla radice del documento XML. Ora puoi utilizzare i vari metodi per attraversare l'albero XML e ricavarne valori, usando vari metodi come GET_CHILDREN, GET_ATTRIBUTES, GET_NAME ecc.

Questo sarà OK per documenti XML piuttosto piccoli, sebbene per efficienza , se stai cercando un set specifico di nodi, potresti voler utilizzare una query XPATH.

+0

molte grazie per la risposta. In primo luogo, non sto cercando alcun gruppo specifico di nodi. Sto scrivendo un metodo molto generico come cambiare il valore dell'attributo di tutti gli elementi in alcune condizioni. Da questo codice, otterrò sicuramente il nodo radice. ma dopo che se sto usando metodi come get_children, otterrò solo il figlio immediato del nodo root. Nel documento di esempio otterrò gli elementi e ma non riuscirò a far entrare il bambino in quelli. Sto cercando un metodo che possa attraversare tutti gli elementi del documento. – <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">Corretto, ti dà solo i bambini immediati. Quello che devi fare è scrivere una subroutine ricorsiva per percorrere l'intero documento. Spero di avere presto il tempo di darvi un esempio. – <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>spero seguente esempio può chiarire la situazione:</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>godere, Alexander.</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">fonte</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="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1038284119" 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>L'attraversamento manuale del xml è soggetto a errori e complicato in ambienti mutevoli. Potresti voler verificare se hai veramente bisogno di un attraversamento diretto del codice.</p> <p>Con l'aiuto delle trasformazioni (XSLT) è possibile convertire XML in tipi strutturati ABAP. XPath è supportato.</p> <p>La dichiarazione, il test e il debug delle trasformazioni vengono eseguiti utilizzando l'Editor di trasformazione aperto dalla transazione <code class="prettyprint-override">STRANS</code>.</p> <p>XSLT è disponibile come tipo di trasformazione: <a href="http://help.sap.com/abapdocu_70/en/ABENABAP_XSLT.htm" rel="nofollow">ABAP XSLT Transformation</a></p> <p>nel codice ABAP sarà sufficiente chiamare l'elemento lingua <code class="prettyprint-override">CALL TRANSFORMATION</code> ed i dati sono pronti per elaborare nella struttura di destinazione in seguito: <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">fonte</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> <script async src="https://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="1575177025"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img.uwenku.com/uwenku/script/side.js?t=1644592048671"></script> <script type="text/javascript" src="http://img.uwenku.com/uwenku/plugin/highlight/highlight.pack.js"></script> <link href="http://img.uwenku.com/uwenku/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="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="5415218910" 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"> Ultima domanda </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://it.uwenku.com/question/p-pllkitam-bk.html" target="_blank" title="Ingresso di ricerca ionica nella barra di intestazione"> Ingresso di ricerca ionica nella barra di intestazione </a> </li> <li class="side_article_list_item"> 2. <a href="http://it.uwenku.com/question/p-kswqfygx-ce.html" target="_blank" title="Codifica della mappa su JSON utilizzando Poison per l'uso con Slack"> Codifica della mappa su JSON utilizzando Poison per l'uso con Slack </a> </li> <li class="side_article_list_item"> 3. <a href="http://it.uwenku.com/question/p-csfnrayo-k.html" target="_blank" title="Array PHP - parentesi quadre vs parentesi graffe ($ array [$ i] vs $ array {$ i})"> Array PHP - parentesi quadre vs parentesi graffe ($ array [$ i] vs $ array {$ i}) </a> </li> <li class="side_article_list_item"> 4. <a href="http://it.uwenku.com/question/p-gzyemnqf-a.html" target="_blank" title="Perché Tuple non ha un'istanza Monad?"> Perché Tuple non ha un'istanza Monad? </a> </li> <li class="side_article_list_item"> 5. <a href="http://it.uwenku.com/question/p-hmzxwvlj-r.html" target="_blank" title="Come analizzare il file CSV in un array in Android Studio"> Come analizzare il file CSV in un array in Android Studio </a> </li> <li class="side_article_list_item"> 6. <a href="http://it.uwenku.com/question/p-rmsxdpby-e.html" target="_blank" title="L'utente del database HSQL non ha il privilegio o l'errore dell'oggetto non trovato"> L'utente del database HSQL non ha il privilegio o l'errore dell'oggetto non trovato </a> </li> <li class="side_article_list_item"> 7. <a href="http://it.uwenku.com/question/p-zwwqahsl-k.html" target="_blank" title="ipython: accesso alla figura corrente()"> ipython: accesso alla figura corrente() </a> </li> <li class="side_article_list_item"> 8. <a href="http://it.uwenku.com/question/p-tcaepbeb-y.html" target="_blank" title="Copia profonda in ES6 utilizzando il simbolo di diffusione"> Copia profonda in ES6 utilizzando il simbolo di diffusione </a> </li> <li class="side_article_list_item"> 9. <a href="http://it.uwenku.com/question/p-qcrwicct-v.html" target="_blank" title="garantito copia del giornale elision di vuoto in un costruttore"> garantito copia del giornale elision di vuoto in un costruttore </a> </li> <li class="side_article_list_item"> 10. <a href="http://it.uwenku.com/question/p-vhgdiupm-k.html" target="_blank" title="RecyclerView smoothScroll per posizionarsi al centro. android"> RecyclerView smoothScroll per posizionarsi al centro. android </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> Problemi correlati</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">Nessun problema correlato^_^</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://it.uwenku.com/contact">Contattaci</a></li> <li>© 2020 IT.UWENKU.COM</li> <li><a target="_blank" href="https://beian.miit.gov.cn/">沪ICP备13005482号-4</a></li> <li><script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1280101193&web_id=1280101193"></script></li> <li><a href="http://www.uwenku.com/" target="_blank" title="优文库">简体中文</a></li> <li><a href="http://hk.uwenku.com/" target="_blank" title="優文庫">繁體中文</a></li> <li><a href="http://ru.uwenku.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.uwenku.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.uwenku.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.uwenku.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.uwenku.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.uwenku.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.uwenku.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.uwenku.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.uwenku.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.uwenku.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.uwenku.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f78a970f17b19a79fc477a3378096f29"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>