第三十七章 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 ...
}
相关推荐
k093310 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯18 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue20 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧22 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
测试界的酸菜鱼34 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
时差95335 分钟前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
让学习成为一种生活方式37 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画43 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend1 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
秋意钟1 小时前
MySQL日期类型选择建议
数据库·mysql