简单转换反序列化:匹配元素错误

时间:2018-06-26 12:36:27

标签: xml sap abap

运行程序后,我必须将以下XML解析为内部表,得到简短的转储。请在下面查看程序和简单转换。简单转换中发生了异常,下面将对此进行详细说明。

分配给类'CX_ST_MATCH_ELEMENT'的异常未被捕获,因此导致运行时错误。

出现异常的原因是:

XML匹配错误预期为元素结尾:“总计” []读取为元素开头:“称重”

请你们中的某人帮助我纠正我的简单转换,这需要一些调整。从上周开始,我一直处于困境,尽管我已经尝试了许多不同的方法来解决问题。

非常感谢


REPORT ZPP_TT_EXAMPLETEST_ST.
DATA itab1 TYPE string.
CONCATENATE '<Automatic>'
'        <Weighing Tolerance="5" Deviation="1.60" >'
'          <Substance ExtId="3"   Speed="1" />'
'          <Substance ExtId="22"  Speed="5" />'
'        </Weighing>'
'        <Weighing Tolerance="5" Deviation="-16" >'
'          <Substance ExtId="22" Speed="5" />'
'        </Weighing>'
'        <Weighing  Tolerance="5" >'
'          <Substance ExtId="22" Speed="5" />'
'        </Weighing>'
'       <Total State="0" Result="Ok" />'
'      </Automatic>'
INTO itab1.

* Substance *
 TYPES: BEGIN OF ty_data,
     ExtId  TYPE CHAR20,
     Speed TYPE CHAR20,
   END OF ty_data.
  DATA: wa_ty_data TYPE ty_data.
  DATA: lt_data TYPE TABLE OF ty_data.

  * Total *
  TYPES: BEGIN OF ty_data3,
     State  TYPE CHAR20,
     Result TYPE CHAR20,
   END OF ty_data3.
 DATA: wa_ty_data3 TYPE ty_data3.
 DATA: lt_data3 TYPE TABLE OF ty_data3.

 * Weighing *
 TYPES: BEGIN OF ty_data2,
     Tolerance  TYPE CHAR20,
     Deviation  TYPE CHAR20,
     t_data     TYPE TABLE OF ty_data WITH DEFAULT KEY,
     t_data3    TYPE TABLE OF ty_data3 WITH DEFAULT KEY,
   END OF ty_data2.
 DATA: wa_ty_data2 TYPE ty_data2.
 DATA: lt_data2 TYPE TABLE OF ty_data2.

 CALL TRANSFORMATION zpp_tt_exampletest_st
    SOURCE XML itab1
    RESULT xml_tab = lt_data2.


<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
 <tt:root name="XML_TAB"/>
 <tt:template>
   <Automatic>
     <tt:loop name="b" ref=".XML_TAB">
       <Weighing>
        <tt:cond check="not-initial($b.TOLERANCE)">
         <tt:attribute name="Tolerance" value-ref="$b.TOLERANCE"/>
        </tt:cond>
        <tt:cond check="not-initial($b.DEVIATION)">
         <tt:attribute name="Deviation" value-ref="$b.DEVIATION"/>
        </tt:cond>
         <tt:loop name="a" ref="$b.T_DATA">
          <Substance>
           <tt:cond check="not-initial($a.EXTID)">
             <tt:attribute name="ExtId" value-ref="$a.EXTID"/>
           </tt:cond>
           <tt:cond check="not-initial($a.SPEED)">
            <tt:attribute name="Speed" value-ref="$a.SPEED"/>
           </tt:cond>
         </Substance>
       </tt:loop>
       <Total>
        <tt:cond check="not-initial($b.STATE)">
          <tt:attribute name="State" value-ref="$b.STATE"/>
        </tt:cond>
        <tt:cond check="not-initial($b.RESULT)">
          <tt:attribute name="Result" value-ref="$b.RESULT"/>
        </tt:cond>
      </Total>
    </Weighing>
  </tt:loop>
 </Automatic>
</tt:template>
</tt:transform>

1 个答案:

答案 0 :(得分:0)

XML和ST之间不匹配。在您的XML中,<Total>放置在所有<Weighing>元素之后,但是在您的简单转换中,<Total>是在<Weighing>元素的内部中定义的。 / p>

在T.Ars请求之后,编辑以跨越T,考虑到它是要纠正的ST,请移动</Weighing></tt:loop>-当然,这是从一个XML示例中推论得出的一种可能性,它可能是错误的在其他XML的情况下(例如Weighing和Total元素的随机顺序),因此从理论上讲,只能基于XML模式(定义XML语法的XSD)提供ST,而不是基于一个XML示例:

您所拥有的:

      </tt:loop>
      <Total>
        <tt:cond check="not-initial($b.STATE)">
          <tt:attribute name="State" value-ref="$b.STATE"/>
        </tt:cond>
        <tt:cond check="not-initial($b.RESULT)">
          <tt:attribute name="Result" value-ref="$b.RESULT"/>
        </tt:cond>
      </Total>
    </Weighing>
  </tt:loop>
</Automatic>

您应该做什么:

    </Weighing>
  </tt:loop>
  <Total>
    <tt:cond check="not-initial($b.STATE)">
      <tt:attribute name="State" value-ref="$b.STATE"/>
    </tt:cond>
    <tt:cond check="not-initial($b.RESULT)">
      <tt:attribute name="Result" value-ref="$b.RESULT"/>
    </tt:cond>
  </Total>
</Automatic>