我有未知结构的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。
答案 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
的类型必须为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
属性。您可以在关键字文档中查找。
答案 2 :(得分:-1)
如果您拥有SAP开发人员许可证,则可以通过随许可证提供的SDK实现这一点。 我用VB.NET编写了类似的东西,如果你对一些样品感兴趣请告诉我。