Object 到ABAP对象的简单XSLT转换
我再次陷入了从XML到ABAP的转换。这次,我想将XML数据直接放入ABAP对象中Object 到ABAP对象的简单XSLT转换,object,xslt,abap,Object,Xslt,Abap,我再次陷入了从XML到ABAP的转换。这次,我想将XML数据直接放入ABAP对象中 我的XML如下所示: <qualityStatus> <address>0</address> <bounceRisk>0</bounceRisk> <checked>1</checked> <domain>1</domain> <domainScores>
我的XML如下所示:
<qualityStatus>
<address>0</address>
<bounceRisk>0</bounceRisk>
<checked>1</checked>
<domain>1</domain>
<domainScores>
<domainScore>
<domain>gmx.de</domain>
<score>0.8333333134651184</score>
</domainScore>
<domainScore>
<domain>ggs.de</domain>
<score>0.6666666269302368</score>
</domainScore>
<domainScore>
<domain>xyz.de</domain>
<score>0.6666666269302368</score>
</domainScore>
</domainScores>
<extSyntax>1</extSyntax>
<mailserver>1</mailserver>
<mailserverDiagnosis>1</mailserverDiagnosis>
<probability>1</probability>
<syntax>1</syntax>
</qualityStatus>
最后,我用类的一个实例调用我的转换:
CALL TRANSFORMATION zst_addressquality
SOURCE XML lw_xml
RESULT result = lo_addressquality.
现在,当通过转换代码进行调试时,它成功地注意到给定lw_xml的所有字段,并似乎将它们写入对象lou addressquality。但是对象属性之后保持为空测试序列化时,我可以访问包含我的对象的结果,但result-w_地址(以及所有其他地址)为空
在测试期间,我创建了一个名称和类型完全相同的结构。有了它,它就按预期工作了
我错过了什么?在处理到ABAP对象的转换时,还有什么需要注意的吗?
_编辑:在更改为XSLT之后,我可以在代码抛出CX\U XSLT\U ABAP\U CALL\U错误之前获取直到W\U地址。因此,我仍然无法正确访问对象的属性:|_ 对象只能通过XSL转换进行序列化/反序列化。用简单的转换dixit是不可能做到的: ST程序仅限于转换基本和结构化ABAP数据以及内部表。当前不支持转换引用变量和引用对象 XSL转换必须将XML转换为,简言之,它对应于如下结构:
<?xml ...?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
...
</asx:values>
<asx:heap>
...
</asx:heap>
</asx:abap>
例如:
REPORT.
CLASS serialization_demo DEFINITION.
PUBLIC SECTION.
INTERFACES if_serializable_object.
DATA attribute TYPE i.
ENDCLASS.
START-OF-SELECTION.
DATA obj_ref TYPE REF TO serialization_demo.
DATA xstring TYPE xstring.
CREATE OBJECT obj_ref.
obj_ref->attribute = 5.
CALL TRANSFORMATION id " serialize
SOURCE root = obj_ref
RESULT XML xstring.
CLEAR obj_ref.
CALL TRANSFORMATION id " deserialize
SOURCE XML xstring
RESULT root = obj_ref.
ASXML(在xstring变量中):
5.
请发布一个非常简单的案例,以便我们能够重现:一个具有一个公共实例属性的类,仅此字段的转换(无需过度复杂化,因为它不是问题的主题),一个仅此字段的XML示例,以及反序列化的代码(您已经完成了)。感谢Sandra,我又改回了XSLT。在调试器中,它在prg:标记处中断。前缀“local”是什么意思?序列化演示是类名,但是local指的是什么?类所在的包?文档中对此进行了解释:“如果类是本地类,则在名称前面添加前缀local
,并用点(.)分隔,以将其与同名的全局类区分开来。”在编辑问题时,我可以看出您没有遵循我的建议:理解ASXML应该是什么样子的最简单方法是使用ID转换序列化(将变量转换为XML)您的对象引用,请参见ASXML的样子(您会看到它不包含前缀local
,因为您没有本地类,您只有一个类池ZCL\u ADDRESS\u QUALITY),然后调整转换以生成与XML相同的内容。
<?xml ...?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
...
</asx:values>
<asx:heap>
...
</asx:heap>
</asx:abap>
CALL TRANSFORMATION id SOURCE anyRootName = yourObjectReference RESULT XML asXMLutf8xstring.
REPORT.
CLASS serialization_demo DEFINITION.
PUBLIC SECTION.
INTERFACES if_serializable_object.
DATA attribute TYPE i.
ENDCLASS.
START-OF-SELECTION.
DATA obj_ref TYPE REF TO serialization_demo.
DATA xstring TYPE xstring.
CREATE OBJECT obj_ref.
obj_ref->attribute = 5.
CALL TRANSFORMATION id " serialize
SOURCE root = obj_ref
RESULT XML xstring.
CLEAR obj_ref.
CALL TRANSFORMATION id " deserialize
SOURCE XML xstring
RESULT root = obj_ref.
<?xml version="1.0" encoding="utf-8"?>
<asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml">
<asx:values>
<ROOT href="#o3"/>
</asx:values>
<asx:heap xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:abap="http://www.sap.com/abapxml/types/built-in" xmlns:cls="http://www.sap.com/abapxml/classes/global" xmlns:dic="http://www.sap.com/abapxml/types/dictionary">
<prg:SERIALIZATION_DEMO id="o3" xmlns:prg="http://www.sap.com/abapxml/classes/program/ZZSRO_TEST16I">
<local.SERIALIZATION_DEMO>
<ATTRIBUTE>5</ATTRIBUTE>
</local.SERIALIZATION_DEMO>
</prg:SERIALIZATION_DEMO>
</asx:heap>
</asx:abap>