2013-05-08 13 views
5

Mam XML o nieznanej strukturze i chcę zastosować ST (Simple Transformation) na nim, aby "jakoś" to treść z XML do struktur ABAP.SAP Prosta transformacja z nieznanym XML

Teraz mam następujące sprawozdania z badań:

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. 

i mam następujący ST transformacji ZTBU_ST_COPY_TEST (jednego o nazwie powyżej):

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

Teraz działa dobrze i będzie to przynieść identyfikatory do pola tabeli LT_OBJ. Jednak reszta jest ignorowana z powodu użycia <TT:SKIP>. Moim celem byłoby uzyskanie reszty dokumentu XML (te FIRST, SECOND, HERE i THERE lub dowolne dowolne XML) do REST pola w "pewnym" formacie - prawdopodobnie jako zgrubny XML przechowywany w zmiennej STRING.

Rozumiem, że muszę zastąpić <TT:SKIP> czymś mądrzejszym, ale nie mogę zrozumieć, co to powinno być ... Jakiś pomysł?

Nota boczna: tak, wiem, lepiej byłoby użyć XSLT lub czegoś innego, zamiast ST, ale nie mam wyboru i muszę zrobić to za pomocą ST.

+0

Nie nazwałbym tego "nieznanym XML". Wydaje się, że zakładasz, że XML zaczyna się od i ma w nim numer , każdy z jednym i innymi nieznanymi elementami. Czy można to bezpiecznie założyć? – Eric

+0

Tak, można bezpiecznie założyć, ,i są znane, ale jestem po reszcie rzeczy i są one naprawdę nieznane ... –

Odpowiedz

0

Jeśli masz licencję programisty SAP, jest to bardzo możliwe dzięki zestawowi SDK dostarczonemu z licencją. Napisałem coś podobnego za pomocą VB.NET, jeśli interesuje Cię kilka przykładów, daj mi znać.

+0

Zobacz uwaga boczna: Potrzebuję tego, aby przejść ze ST, i nie mam innej opcji.- Gdybym mógł przejść do darmowego przetwarzania XML w stylu, mogę spokojnie pozostać po stronie ABAP i byłoby dobrze. Ale potrzebuję tego zrobić w ST. –

0

ST są przymusowe, ponieważ mogą być używane w obie strony (abap < -> xml). Są świetne, ponieważ są szybkie. Ale mapują wartości ABAP na węzły XML i nie ma tam zbyt wielu opcji. Wierzę, że nie możesz tego zrobić ze ST. SXML byłby najlepszy dla twojego senario.

0

Znalazłem sposób na uzyskanie surowego XML w generowanych transformacjach dla usług proxy. Na przykład transformacja wygląda następująco:

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

Należy zauważyć, że nie analizuje to identyfikatora. Wszystko w tagu obj jest wstawiane do REST. Również XML nie może być całkowicie nieznany, ponieważ musisz znać otaczający tag twojego fragmentu. (W tym przypadku obj)

Aby działać typ REST musi być XSDANY (a RAWSTRING). W kodzie:

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

Aby przekształcić xstrings do cstrings można użyć klasy cl_proxy_service. W kodzie napisać:

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

Ważną nieco w transformacji jest atrybutem tt:option. Możesz sprawdzić to w dokumentacji Keyword.