2013-05-08 81 views
5

我有未知结构的XML,我想对其应用ST(简单转换)以“不知何故”将内容从XML转换为ABAP结构。SAP简单转换与未知的XML

现在我有以下的测试报告:

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

我不会称之为“未知的XML”。您似乎认为XML以开头,其中有一个,每个都有一个和其他未知元素。这是安全的吗? – Eric 2013-08-16 12:38:38

+0

是的,这是安全的假设,,是众所周知的,但我在其余的事情后,他们是真正的未知... – 2013-08-19 20:41:37

回答

0

如果您拥有SAP开发人员许可证,则通过许可证提供的SDK很可能会发生这种情况。 我写过类似VB.NET的东西,如果你对某些样本感兴趣,请告诉我。

+0

请参阅旁注:我需要这个去与ST,我没有别的选择。 - 如果我可以进行自由风格的XML处理,那么我可以留在ABAP方面,它会很好。但我需要在ST完成这个工作。 – 2014-02-04 14:09:13

0

由于可以同时使用ST(abap < - > xml),因此ST是约束条件。他们很棒,因为他们很快。但他们将ABAP值映射到XML节点,并没有太多的选择。我相信你不能用ST做到这一点。 SXML最适合你的senario。

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您可以使用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属性。您可以在关键字文档中查找它。