第三十七章 XML 模式的高级选项 - 超类如何表示为类型

文章目录

  • [第三十七章 XML 模式的高级选项 - 超类如何表示为类型](#第三十七章 XML 模式的高级选项 - 超类如何表示为类型)
  • 超类如何表示为类型
  • [基于多个支持 `XML` 的超类的类](#基于多个支持 XML 的超类的类)

第三十七章 XML 模式的高级选项 - 超类如何表示为类型

超类如何表示为类型

如果需要 XML 架构来显示特定的类型层次结构,则需要了解映射如何解释 IRIS 类层次结构。

类层次结构代表了有意义的数据组织等。该层次结构尽可能地反映在相应的 XML 类型定义中。

例如,假设有以下类:

  • 名为 Base 的类,定义了三个公共属性(Property1Property2Property3)。
  • 名为 Addition1 的类,它扩展 Baseand 并定义一个附加公共属性 (Addition1)。
  • 名为 Addition2 的类,它扩展 Addition1 并定义一个附加公共属性 (Addition2)。

Addition2 的架构应包含什么?它必须代表所有五个属性。另外,因为这些类都是用户定义的,所以 Addition2 的架构应该显示类层次结构的详细信息;相反,如果 BaseIRIS 类库扩展一个类,而 IRIS 类库又从该库扩展其他类,那么这些细节就不那么有趣了。

相应地,Addition2XML 模式默认如下所示:

xml 复制代码
<s:complexType name="Addition2">
    <s:complexContent>
        <s:extension base="Addition1">
            <s:sequence>
                <s:element name="Addition2" type="s:decimal" minOccurs="0" />
            </s:sequence>
        </s:extension>
    </s:complexContent>
</s:complexType>
<s:complexType name="Addition1">
    <s:complexContent>
        <s:extension base="Base">
            <s:sequence>
                <s:element name="Addition1" type="s:string" minOccurs="0" />
            </s:sequence>
        </s:extension>
    </s:complexContent>
</s:complexType>
<s:complexType name="Base">
    <s:sequence>
        <s:element name="Property1" type="s:string" minOccurs="0" />
        <s:element name="Property2" type="s:decimal" minOccurs="0" />
        <s:element name="Property3" type="s:date" minOccurs="0" />
    </s:sequence>
</s:complexType>

由于 XML 类型定义不支持多重继承,因此 IRIS XML 支持做出了某些简化假设。对于扩展多个超类的类,假定该类的类型是第一个列出的超类。一个例子如下所示。考虑以下三个类定义。 AddressPart1 包含一个属性:

java 复制代码
Class GXML.Writer.ShowMultiple.AddressPart1 Extends %XML.Adaptor
{
Property Street As %String [ Required ];
}

AddressPart2 类包含另一个属性:

java 复制代码
Class GXML.Writer.ShowMultiple.AddressPart2 Extends %XML.Adaptor
{
Property City As %String [ Required ];
}

最后,Address 继承了这两个类(AddressPart1 作为第一个超类)并添加了更多属性:

java 复制代码
Class GXML.Writer.ShowMultiple.Address Extends 
(GXML.Writers.ShowMultiple.AddressPart1, 
GXML.Writers.ShowMultiple.AddressPart2)
{
Property State As %String(MAXLEN = 2, PATTERN = "2u") [ Required ];
Property Zip As %String(MAXLEN = 10, PATTERN = "5n.1(1""-""4n)") [ Required ];
}

AddressXML 架构如下:

xml 复制代码
<s:complexType name="Address">
    <s:complexContent>
        <s:extension base="AddressPart1">
            <s:sequence>
                <s:element name="City" type="s:string" />
                <s:element name="State" type="s:string" />
                <s:element name="Zip" type="s:string" />
            </s:sequence>
        </s:extension>
    </s:complexContent>
</s:complexType>
<s:complexType name="AddressPart1">
    <s:sequence>
        <s:element name="Street" type="s:string" />
    </s:sequence>
</s:complexType>

请注意以下事项:

  • 第一个列出的超类 AddressPart1 由相应的 XML 类型表示,其中包含所有预期的详细信息。
  • 除了 AddressPart1 类型包含的属性之外,所有剩余属性都分配给 Address 类型。一旦 AddressPart1 类被映射,这是这些属性的唯一可能的表示。
  • AddressPart1AddressPart2 都是 %XML.Adaptor 的子类,但没有公开 %XML.Adaptor 的结构。重点是自定义类,这是合适的。

以下规则控制当查看给定类的架构时如何处理超类:

  • 如果超类继承自 %XML.Adaptor,则它由 XML 类型表示,该类型表示此类的所有映射属性。短类名被视为属性的 XML 类型。如果该类为 XMLTYPE 参数指定了一个值,则该值将用作类型名称。
  • 如果超类不是从%XML.Adaptor 继承,则它不由 XML 类型表示。如果它有任何属性,它们将被分配给继承类(正在查看其架构的类)。
  • 如果给定的类继承自多个超类,则会为第一个超类创建 XML 类型(如果适用;请参阅前面的规则)。不属于第一个超类的所有属性都将分配给继承类,如前面的示例所示。

基于多个支持 XML 的超类的类

在某些情况下,给定的类可能基于多个支持 XML 的超类。在这种情况下,相应的 XML 模式会考虑这些类的列出顺序。例如,考虑以下类,它继承自两个支持 XML 的超类:

java 复制代码
Class Test.Default Extends (Test.Superclass1, Test.Superclass2)
{
///additional class members ...
}

此类的 XML 架构在从 Test.Superclass2 派生的 XML 类型之前列出了从最左侧的类 Test.Superclass1 派生的 XML 类型。当为此类的对象生成 XML 输出时,也会发生相同的顺序。

如果希望从右到左确定 XML 架构(和输出),请将 XMLINHERITANCE 参数指定为"right"。例如:

java 复制代码
Class Test.Default Extends (Test.Superclass1, Test.Superclass2)
{
Parameter XMLINHERITANCE = "right";

///additional class members ...
}
相关推荐
一粒沙白猫1 分钟前
Java综合练习04
java·开发语言·算法
哎呦你好6 分钟前
【CSS】Grid 布局基础知识及实例展示
开发语言·前端·css·css3
一入JAVA毁终身17 分钟前
处理Lombok的一个小BUG
java·开发语言·bug
SailingCoder20 分钟前
MongoDB Memory Server与完整的MongoDB的主要区别
数据库·mongodb
水木石画室21 分钟前
MongoDB 常用增删改查方法及示例
数据库·mongodb
旷世奇才李先生22 分钟前
MongoDB 安装使用教程
数据库·mongodb
qq_3392822325 分钟前
mongodb 中dbs 时,local代表的是什么
数据库·mongodb
Hellyc39 分钟前
JAVA八股文:异常有哪些种类,可以举几个例子吗?Throwable类有哪些常见方法?
java·开发语言
2301_803554521 小时前
c++中的绑定器
开发语言·c++·算法
海棠蚀omo1 小时前
C++笔记-位图和布隆过滤器
开发语言·c++·笔记