2013-05-08 3 views
5

私は未知の構造のXMLを持っており、XMLからABAP構造へのコンテンツを "何らかの形で"取得するためにST(Simple Transformation)を適用したいと考えています。未知のXMLを使ったSAPのシンプルな変換

report ztbu_st_with_copy. 

data: lf_xml type string. 
concatenate '<tab><obj>' 
       '<id>A1</id>' 
       '<first>Erste</first>' 
       '<second>Zweite</second>' 
      '</obj><obj>' 
       '<id>B2</id>' 
       '<item>' 
       '<here>Tady</here>' 
       '<there>Tam</there>' 
       '</item>' 
      '</obj>' 
      '</tab>' 
     into lf_xml. 

types: begin of ys_obj, 
     id type string, 
     rest type string, 
     end of ys_obj, 
     yt_obj type standard table of ys_obj. 

data: lt_obj type yt_obj. 

call transformation ztbu_st_copy_test 
    source xml lf_xml 
    result root = lt_obj. 

uline. 

data: ls_obj like line of lt_obj. 
loop at lt_obj into ls_obj. 
    write:/sy-tabix, ls_obj-id. 
endloop. 

uline. 

と私は、次のしているST変換ZTBU_ST_COPY_TEST(上記と呼ばれる1):

<?sap.transform simple?> 
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"> 

<tt:root name="ROOT"/> 

<tt:template> 
    <tab> 
    <tt:loop ref=".ROOT" name="obj"> 
     <obj> 
     <id> 
      <tt:value ref="$obj.ID" /> 
     </id> 
     <tt:skip /> 
     </obj> 
    </tt:loop> 
    </tab> 
</tt:template> 

</tt:transform> 

は、今では正常に動作し、それがにIDを持って来る今の私は、試験報告書以下のいる

テーブルLT_OBJのフィールドしかし、残りは<TT:SKIP>の使用のため無視されます。私の目標は、残りのXML文書(これらのFIRST、SECOND、HERE、THEREまたは任意のXML)をフィールド「REST」に「some」形式で取得することです。おそらくSTRING変数に格納された大雑把なXMLです。

私は<TT:SKIP>をよりスマートなものに置き換える必要があることを理解していますが、それが何であるべきかを理解することはできません。

サイドノート:はい、私は知っていますが、STの代わりにXSLTなどを使用する方が良いでしょうが、選択肢がなく、STを使用して作成する必要があります。

+0

私は「未知のXML」と呼んでいません。あなたは、XMLがで始まり、という数字を持っていると仮定しているようです。それぞれはと他の未知の要素を持っています。これは仮定するのが安全ですか? – Eric

+0

はい、これは、が知られていても安全ですが、残りの部分は後であり、本当に不明です... –

答えて

0

SAPデベロッパーのライセンスをお持ちの場合は、ライセンスに付属のSDKを使用すると非常に可能です。 いくつかのサンプルに興味があれば、VB.NETを使って同様のことを書いてきました。

+0

サイドノートを参照してください:私には他の選択肢はありません。 - 私が自由なスタイルのXML処理のために行くことができれば、私はABAP側にとどまることができ、うまくいくでしょう。しかし、私はこれをSTで行う必要があります。 –

0

STは両方の方法で使用できるので制約があります(< - > xml)。彼らは速いので素晴らしいです。しかし、それらはABAP値をXMLノードにマップします。そこにはあまりオプションはありません。私はあなたがSTでこれをすることはできないと信じています。 SXMLはあなたのシナリオに最適です。

0

プロキシサービス用に生成された変換で未処理のXMLを取得する方法が見つかりました。たとえば、変換は次のようになります。

<?sap.transform simple?> 
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"> 

    <tt:root name="ROOT"/> 

<tt:template> 
    <tab> 
     <tt:loop name="obj" ref=".ROOT"> 
     <obj tt:ap="y" tt:option="allNsps,noRootAttr" tt:value-ref="$obj.REST"/> 
     </tt:loop> 
    </tab> 
    </tt:template> 

</tt:transform> 

これはIDを解析しないことに注意してください。 objタグ内のすべてがRESTに入れられます。また、フラグメントの周囲のタグを知る必要があるため、XMLを完全に未知にすることはできません。 (この場合obj

RESTのタイプは、XSDANYRAWSTRING)である必要があります。あなたのコード内:

TYPES: BEGIN OF ys_obj, 
     id TYPE string, 
     rest TYPE xsdany, 
     END OF ys_obj, 
     yt_obj TYPE STANDARD TABLE OF ys_obj. 

xstringsをcstringsに変換するには、クラスcl_proxy_serviceを使用できます。あなたのコードを書いてください:

LOOP AT lt_obj INTO ls_obj. 
    WRITE:/sy-tabix, ls_obj-id, cl_proxy_service=>xstring2cstring(ls_obj-rest). 
ENDLOOP. 

変換の重要なビットは、tt:option属性です。あなたはキーワードのドキュメントでそれを見ることができます。

関連する問題