7

我有未知结构的 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。

4

3 回答 3

1

ST 是约束,因为可以两种方式使用(abap <-> xml)。它们很棒,因为它们速度很快。但是它们将 ABAP 值映射到 XML 节点,并且那里没有太多选择。我相信你不能用 ST 做到这一点。SXML 最适合您的场景。

于 2015-11-17T10:13:04.640 回答
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必须是XSDANY(a 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,您可以使用 class 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属性。您可以在关键字文档中查找它。

于 2016-07-29T12:58:03.053 回答
-2

如果您有 SAP 开发人员的许可证,这很可能通过随许可证提供的 SDK 实现。我已经使用 VB.NET 编写了类似的东西,如果您对某些示例感兴趣,请告诉我。

于 2014-02-04T11:13:57.603 回答