含命名空间XML转ABAP内表触发CX_ST_MATCH_ELEMENT异常求助
问题描述
尝试将带命名空间的根标签<CBISDDStsRptLogMsg>的XML文件反序列化为ABAP内表时,触发CX_ST_MATCH_ELEMENT异常,调试发现处理到<OrgnlPmtInfAndSts>标签时崩溃。目标是提取可重复的<TxInfAndSts>节点下<Rsn>的<Cd>值与<AddtlInf>值。
提供的XML片段:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <CBISDDStsRptLogMsg xmlns="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <GrpHdr> <MsgId>.....</MsgID> </GrpHdr> <OrgnlGrpInfAndSts> ... ... </OrgnlGrpInfAndSts> <OrgnlPmtInfAndSts> <OrgnlPmtInfId>...</OrgnlPmtInfId> <TxInfAndSts> <OrgnlInstrId>.....</OrgnlInstrId> <OrgnlEndToEndId>.....</OrgnlEndToEndId> <TxSts>.....</TxSts> <StsRsnInf> <Orgtr> <Nm>.....</Nm> </Orgtr> <Rsn> <Cd>ABC</Cd> </Rsn> <AddtlInf>XYZ</AddtlInf> </StsRsnInf> </TxInfAndSts> </OrgnlPmtInfAndSts> </CBISDDStsRptLogMsg>
当前使用的Simple Transformation(STRANS)代码片段:
<?sap.transform simple?> <tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary"> <tt:root name="CBISDDStsRptLogMsg" type="ddic:ZEUDDR_XML_IT"/> <tt:template> <CBISDDStsRptLogMsg xmlns="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" tt:ref=".CBISDDStsRptLogMsg"> <tt:skip name="GrpHdr"/> <tt:skip name="OrgnlGrpInfAndSts"/> <OrgnlPmtInfAndSts> <tt:skip name="OrgnlPmtInfId"/> <tt:loop ref="ITEMS"> <TxInfAndSts> <tt:skip name="OrgnlInstrId"/> <tt:skip name="OrgnlEndToEndId"/> <tt:skip name="TxSts"/> <StsRsnInf> <tt:skip name="Orgtr"/> <Rsn> <Cd tt:value-ref="REASON_CODE"/> </Rsn> <AddtlInf tt:value-ref="REASON_TEXT"/> </StsRsnInf> <OrgnlTxRef> </OrgnlTxRef> </TxInfAndSts> </tt:loop> </OrgnlPmtInfAndSts> </CBISDDStsRptLogMsg> </tt:template> </tt:transform>
错误原因分析
- 命名空间未正确绑定:XML中所有子元素(包括
<OrgnlPmtInfAndSts>、<TxInfAndSts>等)都继承了根节点的命名空间urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00,但STRANS模板中的这些子元素未关联该命名空间,导致Simple Transformation无法匹配到XML中的对应节点,触发元素匹配异常。 - 冗余节点定义:STRANS模板中包含了XML片段里不存在的
<OrgnlTxRef>节点,ST会强制期望找到该元素,找不到则抛出匹配异常。 - 潜在的重复节点处理缺失:如果XML中存在多个
<OrgnlPmtInfAndSts>节点,当前模板仅处理单个节点,后续节点会导致匹配失败(当前崩溃点在第一个该节点,主要原因还是前两点)。
解决方法
1. 绑定命名空间
在STRANS的tt:transform标签中定义根节点命名空间的前缀,然后所有XML子元素都使用该前缀,确保ST能正确识别命名空间下的节点:
<?sap.transform simple?> <tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:cbi="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"> <tt:root name="CBISDDStsRptLogMsg" type="ddic:ZEUDDR_XML_IT"/> <tt:template> <cbi:CBISDDStsRptLogMsg tt:ref=".CBISDDStsRptLogMsg"> <tt:skip name="GrpHdr" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <tt:skip name="OrgnlGrpInfAndSts" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <cbi:OrgnlPmtInfAndSts> <tt:skip name="OrgnlPmtInfId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <tt:loop ref="ITEMS"> <cbi:TxInfAndSts> <tt:skip name="OrgnlInstrId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <tt:skip name="OrgnlEndToEndId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <tt:skip name="TxSts" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <cbi:StsRsnInf> <tt:skip name="Orgtr" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <cbi:Rsn> <cbi:Cd tt:value-ref="REASON_CODE"/> </cbi:Rsn> <cbi:AddtlInf tt:value-ref="REASON_TEXT"/> </cbi:StsRsnInf> </cbi:TxInfAndSts> </tt:loop> </cbi:OrgnlPmtInfAndSts> </cbi:CBISDDStsRptLogMsg> </tt:template> </tt:transform>
2. 移除冗余节点
删除STRANS模板中XML不存在的<OrgnlTxRef>节点,避免ST期望匹配不存在的元素。
3. 处理重复的<OrgnlPmtInfAndSts>节点(可选)
如果XML中存在多个<OrgnlPmtInfAndSts>节点,需要用tt:loop包裹该节点,确保所有节点都能被处理:
<tt:loop ref="PMT_INF_ITEMS"> <cbi:OrgnlPmtInfAndSts> <tt:skip name="OrgnlPmtInfId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/> <tt:loop ref="ITEMS"> <!-- 原TxInfAndSts处理逻辑 --> </tt:loop> </cbi:OrgnlPmtInfAndSts> </tt:loop>
注:需确保ZEUDDR_XML_IT结构包含内表PMT_INF_ITEMS,其行结构包含ITEMS内表。
4. 确认ABAP内表结构
确保ZEUDDR_XML_IT结构包含:
- 内表
ITEMS,其行结构包含REASON_CODE(类型匹配<Cd>的字符串)和REASON_TEXT(类型匹配<AddtlInf>的字符串)。
内容的提问来源于stack exchange,提问作者smokey
相关产品推荐
相关产品推荐

