运行程序后,我必须将以下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>
答案 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>