[英]SAP Simple Transformation with arbitrary XML tags
我有未知結構的 XML,我想在其上應用 ST(簡單轉換)以“以某種方式”將 XML 中的內容轉換為 ABAP 結構。
現在我有以下測試報告:
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 (上面稱為的那個):
<?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 - 可能是存儲在 STRING 變量中的粗略 XML。
我知道我需要用更智能的東西替換<TT:SKIP>
,但我不知道那應該是什么......知道嗎?
旁注:是的,我知道,最好使用 XSLT 或其他東西,而不是 ST,但我別無選擇,我需要使用 ST。
ST 是約束,因為可以同時使用兩種方式(abap <-> xml)。 他們很棒,因為他們很快。 但是它們將 ABAP 值映射到 XML 節點,並且沒有太多選項。 我相信你不能用 ST 做到這一點。 SXML 最適合您的場景。
我找到了一種在生成的代理服務轉換中獲取原始 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
的類型必須是XSDANY
(一個RAWSTRING
)。 在您的代碼中:
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
屬性。 您可以在關鍵字文檔中查找。
如果您擁有 SAP 開發人員許可證,則可以通過隨許可證提供的 SDK 實現這一點。 我已經使用 VB.NET 編寫了類似的內容,如果您對某些示例感興趣,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.