美文网首页
第三十三章 控制到 XML 模式的映射 - 其他支持 XML 的

第三十三章 控制到 XML 模式的映射 - 其他支持 XML 的

作者: Cache技术分享 | 来源:发表于2023-12-12 08:54 被阅读0次

    第三十三章 控制到 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 类型分配给命名空间,如下所示:

    1. 如果相应的类定义定义了 XSDTYPE 类参数,则该类型位于以下 W3 命名空间中:
    http://www.w3.org/2001/XMLSchema
    

    只能在数据类型类中指定 XSDTYPE

    注意:数据类型类不继承 XSDTYPE 类参数。也就是说,如果对现有数据类型类进行子类化,并且该类应映射到 XSD 类型之一,则必须指定此参数。

    1. 如果类定义未定义 XSDTYPE 但定义了 NAMESPACE,则该类型位于 NAMESPACE 指定的命名空间中。
    2. 否则该类型不在任何命名空间中。

    但是,可以在生成架构时指定命名空间。请参阅使用 XML 工具中的从类生成 XML 模式。

    要查看分配类型的命名空间,必须使用 %XML.Schema 并使用 %XML.Write。有关详细信息,请参阅使用 XML 工具中的从类生成 XML 模式。

    抑制类型 QName 的命名空间前缀

    如使用 XML 工具中所述,当使用 %XML.Writer 生成输出时,可以包含 XML 类型属性;为此,请将 writerOutputTypeAttribute 属性指定为 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 类型所属的命名空间。它只是抑制类型前缀的写入。

    相关文章

      网友评论

          本文标题:第三十三章 控制到 XML 模式的映射 - 其他支持 XML 的

          本文链接:https://www.haomeiwen.com/subject/jzkvgdtx.html