第三十七章 XML 模式的高级选项 - 超类如何表示为类型
超类如何表示为类型
如果需要 XML
架构来显示特定的类型层次结构,则需要了解映射如何解释 IRIS
类层次结构。
类层次结构代表了有意义的数据组织等。该层次结构尽可能地反映在相应的 XML
类型定义中。
例如,假设有以下类:
- 名为
Base
的类,定义了三个公共属性(Property1
、Property2
和Property3
)。 - 名为
Addition1
的类,它扩展Baseand
并定义一个附加公共属性 (Addition1
)。 - 名为
Addition2
的类,它扩展Addition1
并定义一个附加公共属性 (Addition2
)。
Addition2
的架构应包含什么?它必须代表所有五个属性。另外,因为这些类都是用户定义的,所以 Addition2
的架构应该显示类层次结构的详细信息;相反,如果 Base
从 IRIS
类库扩展一个类,而 IRIS
类库又从该库扩展其他类,那么这些细节就不那么有趣了。
相应地,Addition2
的 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
包含一个属性:
Class GXML.Writer.ShowMultiple.AddressPart1 Extends %XML.Adaptor
{
Property Street As %String [ Required ];
}
AddressPart2
类包含另一个属性:
Class GXML.Writer.ShowMultiple.AddressPart2 Extends %XML.Adaptor
{
Property City As %String [ Required ];
}
最后,Address
继承了这两个类(AddressPart1
作为第一个超类)并添加了更多属性:
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 ];
}
Address
的 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
类被映射,这是这些属性的唯一可能的表示。 AddressPart1
和AddressPart2
都是%XML.Adaptor
的子类,但没有公开%XML.Adaptor
的结构。重点是自定义类,这是合适的。
以下规则控制当查看给定类的架构时如何处理超类:
- 如果超类继承自
%XML.Adaptor
,则它由XML
类型表示,该类型表示此类的所有映射属性。短类名被视为属性的XML
类型。如果该类为XMLTYPE
参数指定了一个值,则该值将用作类型名称。 - 如果超类不是从
%XML.Adaptor
继承,则它不由XML
类型表示。如果它有任何属性,它们将被分配给继承类(正在查看其架构的类)。 - 如果给定的类继承自多个超类,则会为第一个超类创建
XML
类型(如果适用;请参阅前面的规则)。不属于第一个超类的所有属性都将分配给继承类,如前面的示例所示。
基于多个支持 XML
的超类的类
在某些情况下,给定的类可能基于多个支持 XML
的超类。在这种情况下,相应的 XML
模式会考虑这些类的列出顺序。例如,考虑以下类,它继承自两个支持 XML
的超类:
Class Test.Default Extends (Test.Superclass1, Test.Superclass2)
{
///additional class members ...
}
此类的 XML
架构在从 Test.Superclass2
派生的 XML
类型之前列出了从最左侧的类 Test.Superclass1
派生的 XML
类型。当为此类的对象生成 XML
输出时,也会发生相同的顺序。
如果希望从右到左确定 XML
架构(和输出),请将 XMLINHERITANCE
参数指定为“right
”。例如:
Class Test.Default Extends (Test.Superclass1, Test.Superclass2)
{
Parameter XMLINHERITANCE = "right";
///additional class members ...
}