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>
        <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>

编辑:我改回 XSLT 转换,缩短为一个属性,如下所示:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:output encoding="iso-8859-1" indent="yes" method="xml" version="1.0"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/qualityStatus">
    <asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml">
        <asx:values>
            <ROOT href="#o26"/>
        </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">
            <cls:ZCL_ADDRESS_QUALITY id="o26" >
                <local.ZCL_ADDRESS_QUALITY>
                    <W_ADDRESS>
                        <xsl:value-of select="address"/>
                    </W_ADDRESS>
                    <!--More attributes here-->
                </local.ZCL_ADDRESS_QUALITY>
            </cls:ZCL_ADDRESS_QUALITY>
        </asx:heap>
    </asx:abap>
</xsl:template>

我的对象属性现在都是公共(public)的,因为我认为这可能是问题所在。然而,setter 和 getter 确实存在。是的,我的类确实实现了 if_serialized_object 接口(interface)。

 DATA:
  w_address             TYPE char1,
  w_bouncerisk          TYPE char1,
  w_checked             TYPE char1,
  w_decoded             TYPE stringval,
  w_domain              TYPE char1,
  w_domainscores        TYPE z_domainscore_t, "Table type for name + score
  w_extsyntax           TYPE char1,
  w_mailserver          TYPE char1,
  w_mailserverdiagnosis TYPE char1,
  w_probability         TYPE char1,
  w_syntax              TYPE char1,
  w_syntaxwarnings      TYPE z_syntaxwarnings_t. "Table of syntaxwarnings

最后,我用类的实例调用我的转换:

CALL TRANSFORMATION zst_addressquality
      SOURCE XML lw_xml
      RESULT result = lo_addressquality.

现在,在通过转换代码进行调试时,它成功地注意到给定 lw_xml 的所有字段,并似乎将它们写入对象 lo_addressquality 中。但此后对象属性仍为空。
测试序列化时,我可以访问包含我的对象的结果,但 result-w_address (和所有其他)为空。
在测试时,我创建了一个具有完全相同的名称和类型的结构。有了它,它就按预期工作了。

我缺少什么?在转换为 ABAP 对象时还有什么需要注意的吗? _编辑:更改为 XSLT 后,我可以在代码抛出 CX_XSLT_ABAP_CALL_ERROR 之前到达 W_ADDRESS。所以,我仍然无法正确访问对象的属性。 :|_

最佳答案

对象只能通过XSL转换进行序列化/反序列化。不可能通过简单的转换来做到这一点,dixit ABAP documentation :

ST programs are restricted to the transformation of elementary and structured ABAP data, along with internal tables. The transformation of reference variables and referenced objects is not currently supported.

XSL 转换必须将 XML 转换为 ASXML ,简而言之,它对应于这样的结构:

<?xml ...?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
  <asx:values>
    ...
  </asx:values>
  <asx:heap>
    ...
  </asx:heap>
</asx:abap>

了解 ASXML 的最简单方法是使用 identity transformation 序列化对象引用。 (这是一个 XSL 转换),然后调整您的转换以生成相同类型的 asXML:

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.

ASXML(在 xstring 变量中):

<?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>

关于object - 简单的 XSLT 转换为 ABAP 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49295540/

相关文章:

xml - XSLT 1.0 使用基于父属性的键进行分组

c# - 使用 RFC_READ_TABLE 读取 TCURR 表会截断速率值

xml - 遍历一个 XML 文档的所有节点?

java - 简单的对象和方法

java - 在 Java 中使用给定概率填充对象的二维数组

用于从对象范围内访问对象属性的 JavaScript 语法

java - 如何从 java 调用命名的 XSLT 模板

javascript - 访问私有(private)静态对象和方法

xml - XPath表达式以选择唯一节点

abap - SAP 逻辑数据库隐式包含宏。如何?