调用转换xml到abap

时间:2017-07-31 23:16:01

标签: xml-parsing sap abap

我正在尝试将简单的xml转换为abap。

我使用交易xslt_tool。

我要转储

  

Errores tiempo ejec。 ST_MATCH_FAILExcepción
  CX_ST_MATCH_ELEMENT Fecha y hora 31.07.2017 18:55:46

你能告诉我我做错了吗?

这是xml:

<?xml version="1.0" encoding="UTF-8"?>
<objects type="array">
    <object>
        <transaction-id type="integer">28</transaction-id>
        <message type="symbol">FAILURE</message>
        <errors type="array">
            <error>
                <row type="integer">0</row>
                <field>Sin datos</field>
                <message>El Json no puede estar en blanco.</message>
            </error>
        </errors>
    </object>
</objects>

xslt_tool

enter image description here

这是程序生成的xslt:

<?sap.transform simple?> <tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">   <tt:root name="ZDGR2_RETORNOINVOCACION" type="ddic:ZDGR2_RETORNOINVOCACION"/>   <tt:template>
    <ZDGR2_RETORNOINVOCACION>

      <MESSAGE tt:value-ref=".ZDGR2_RETORNOINVOCACION.MESSAGE"/>
      <TRANSACTION_ID tt:value-ref=".ZDGR2_RETORNOINVOCACION.TRANSACTION_ID"/>
      <ERRORS>
        <tt:loop ref=".ZDGR2_RETORNOINVOCACION.ERRORS">
          <ZDGR2_ERRORS>
            <FILA tt:value-ref="FILA"/>
            <FIELD tt:value-ref="FIELD"/>
            <MESSAGE tt:value-ref="MESSAGE"/>
          </ZDGR2_ERRORS>
        </tt:loop>
      </ERRORS>
    </ZDGR2_RETORNOINVOCACION>   </tt:template> </tt:transform>

这是一个简单的程序。

Data: lv_xml Type string. data: it_resultado type ZDGR2_RETORNOINVOCACION. Concatenate '<?xml version="1.0" encoding="UTF-8"?><objects type="array"><object><transaction-id type="integer">28</transaction-id><message type="symbol">FAILURE</message><errors type="array"><error><row type="integer">0</row><field>Sin datos</field>' '<message>El Json no puede estar en blanco.</message></error></errors></object></objects>' Into lv_xml. CALL TRANSFORMATION ZDGR2_RETORNOINVOCACION
    SOURCE XML lv_xml
    RESULT ZDGR2_RETORNOINVOCACION = it_resultado.

1 个答案:

答案 0 :(得分:1)

当XML中的标记与转换中的标记或顺序不同时,就会发生此转储。

在你的例子中,我看到了多重问题:

您的XML结构如下所示:

<object>
   <transaction-id type="integer">28</transaction-id>
   <message type="symbol">FAILURE</message>

但你的转型就是这样开始的:

<ZDGR2_RETORNOINVOCACION>
  <MESSAGE tt:value-ref=".ZDGR2_RETORNOINVOCACION.MESSAGE"/> 
  <TRANSACTION_ID tt:value-ref=".ZDGR2_RETORNOINVOCACION.TRANSACTION_ID"/>

因此,我认为<ZDGR2_RETORNOINVOCACION>应该被命名为<object><MESSAGE><TRANSACTION_ID>必须被转换。

同样在错误子结构中,您有一些不匹配

 <error>
     <row type="integer">0</row>
     <field>Sin datos</field>
     <message>El Json no puede estar en blanco.</message>
  </error>

<ZDGR2_ERRORS>
     <FILA tt:value-ref="FILA"/>
     <FIELD tt:value-ref="FIELD"/>
     <MESSAGE tt:value-ref="MESSAGE"/>
</ZDGR2_ERRORS>

<ZDGR2_ERRORS>应命名为<error><FILA>应命名为<row>

因此,重要的规则是标签在xml文件中具有相同的名称和顺序(它不区分大小写,因此无论其<OBJECT>还是<object>都无关紧要。

我方的建议是,您可以调试转换。逐步完成并通过标签转储大部分时间名称或订单不正常。所以你可以快速找到错误,你不必比较整个xml结构。