簡體   English   中英

帶有任意 XML 標簽的 SAP 簡單轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM