文章目录
第三十三章 控制到 XML 模式的映射 - 其他支持 XML 的类到 XML 类型的映射
其他支持 XML
的类到 XML
类型的映射
对于支持 XML
的类或基于支持 XML
的类的属性,XML
类型按如下方式确定: 如果该类具有 XMLTYPE
参数的值,则该值将用作类型名称。否则,短类名将被视为 XML
类型名。
例如,考虑以下类定义:
Class GXML.PersonWithAddress Extends (%Persistent, %XML.Adaptor)
{
Parameter XMLTYPE = "PersonType";
Property Name As %Name;
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");
Property HomeAddress As GXML.Address;
}
对于此类的实例,XML
类型是 PersonType
,它取自 XMLTYPE
参数。
假设 GXML.Address
类不包含 XMLTYPE
参数。在本例中,对于 <HomeAddress>
元素,XML
类型是 Address
,它是短类名。
指定类型的命名空间
XML
类型分配给命名空间,如下所示:
- 如果相应的类定义定义了
XSDTYPE
类参数,则该类型位于以下W3
命名空间中:
http://www.w3.org/2001/XMLSchema
只能在数据类型类中指定 XSDTYPE
。
注意:数据类型类不继承 XSDTYPE
类参数。也就是说,如果对现有数据类型类进行子类化,并且该类应映射到 XSD
类型之一,则必须指定此参数。
- 如果类定义未定义
XSDTYPE
但定义了NAMESPACE
,则该类型位于NAMESPACE
指定的命名空间中。 - 否则该类型不在任何命名空间中。
但是,可以在生成架构时指定命名空间。请参阅使用 XML
工具中的从类生成 XML
模式。
要查看分配类型的命名空间,必须使用 %XML.Schema
并使用 %XML.Write
。有关详细信息,请参阅使用 XML
工具中的从类生成 XML
模式。
抑制类型 QName
的命名空间前缀
如使用 XML 工具中所述,当使用 %XML.Writer
生成输出时,可以包含 XML
类型属性;为此,请将 writer
的 OutputTypeAttribute
属性指定为 1
。
默认情况下,类型属性被写为 QName
(限定名称),它指示类型的名称以及该类型所属的命名空间。例如:
<TeamA xmlns:s01="http://mynamespace" xsi:type="s01:TeamA">
可以定义相应的 IRIS
类定义,以便抑制命名空间前缀。例如:
<TeamB xsi:type="TeamB">
例如,考虑以下类定义:
Class STP.TeamA Extends (%RegisteredObject, %XML.Adaptor)
{
Parameter NAMESPACE = "http://mynamespace";
Property Member1 as %String;
Property Member2 as %String;
}
类 STP.TeamB
(未显示)具有相同的定义,但还将 SUPPRESSTYPEPREFIX
指定为 1
。
这两个类都用作第三个类中的属性:
Class STP.Container Extends (%RegisteredObject, %XML.Adaptor)
{
Parameter NAMESPACE = "http://mynamespace";
Property TeamA As STP.TeamA;
Property TeamB As STP.TeamB;
}
当我们为 STP.Container
实例生成输出(并且启用 XML
类型属性的输出)时,我们会看到如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Container xmlns="http://mynamespace"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TeamA xmlns:s01="http://mynamespace" xsi:type="s01:TeamA">
<Member1 xsi:type="s:string">Jack O'Neill</Member1>
<Member2 xsi:type="s:string">Samantha Carter</Member2>
</TeamA>
<TeamB xsi:type="TeamB">
<Member1 xsi:type="s:string">Jasper O'Nelson</Member1>
<Member2 xsi:type="s:string">Sandra Chartres</Member2>
</TeamB>
</Container>
请注意,<TeamA>
元素包含 xsi:type
属性,该属性等于“s01:TeamA
”。该元素中的命名空间声明表明 s01
前缀引用命名空间 http://mynamespace
。
但是<TeamB>
元素在 xsi:type
属性中不包含前缀。
注意:SUPPRESSTYPEPREFIX
不会影响 XML
类型所属的命名空间。它只是抑制类型前缀的写入。