具有未知XML的SAP简单转换

时间:2013-05-08 15:30:42

标签: xml sap abap xml-deserialization

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

3 个答案:

答案 0 :(得分:1)

ST是约束,因为可以两种方式使用(abap&lt; - &gt; xml)。他们很棒,因为他们很快。但是他们将ABAP值映射到XML节点,那里的选项不多。我相信你不能用ST做到这一点。 SXML最适合您的Senario。

答案 1 :(得分:1)

我找到了一种在代理服务的生成转换中获取原始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属性。您可以在关键字文档中查找。

答案 2 :(得分:-1)

如果您拥有SAP开发人员许可证,则可以通过随许可证提供的SDK实现这一点。 我用VB.NET编写了类似的东西,如果你对一些样品感兴趣请告诉我。