6

if_ixl_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>このドキュメントでは、ノードなどをトラバースする必要があります。

前もって感謝します

よろしく、アレックス

4

5 に答える 5

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 のインスタンスができました。GET_CHILDREN、GET_ATTRIBUTES、GET_NAME などのさまざまなメソッドを使用して、さまざまなメソッドを使用して XML ツリーを走査し、そこから値を取得できるようになりました。

かなり小さな XML ドキュメントの場合はこれで問題ありませんが、特定のノード セットを探している場合は、効率を上げるために XPATH クエリを使用することをお勧めします。

于 2011-10-04T12:10:27.523 に答える
2

詳細なXML マニュアルは、SAP のドキュメント Web サイトにあります(リンクが正しく機能しない場合は、help.sap.comの NetWeaver Developer's Guide に移動し、「xml ライブラリ」を検索してください)。

「iXML ABAP オブジェクトのジャンプスタート」の章を読むとすぐに始められます。「完全な 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.
于 2011-10-04T19:19:28.037 に答える
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.

楽しんでください、アレキサンダー。

于 2011-10-05T10:52:42.787 に答える
0

手動の xml トラバースはエラーが発生しやすく、変化する環境では複雑です。直接的なコード トラバーサルが本当に必要かどうかを確認することをお勧めします。

(XSLT) 変換の助けを借りて、XML を ABAP 構造化タイプに変換できます。XPath がサポートされています。

変換の宣言、テスト、およびデバッグは、 transaction によって開かれた Transformation Editor を使用して行われSTRANSます。

XSLT は変換タイプとして利用可能です: ABAP XSLT 変換

ABAPコードで言語要素CALL TRANSFORMATIONを呼び出すだけで、データは後でターゲット構造で処理する準備が整います: ABAPステートメント: 'CALL TRANSFORMATION'

于 2012-01-09T20:47:32.393 に答える
-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
}
于 2011-10-04T12:09:12.970 に答える