第二十一章 指定元素和属性的命名空间
XML 元素和属性可以属于不同的命名空间,并且 XML 模式规范提供了多种控制和表示命名空间分配的方法。类中的 %XML.Adaptor为XML 文档提供相应的支持。
类和属性参数
-
NAMESPACE -
ELEMENTQUALIFIED -
ATTRIBUTEQUALIFIED -
XMLREF -
REFNAMESPACE -
XSDTYPE -
XMLPREFIX
概述
本节回顾了 XML 命名空间,并概述了如何将 IRIS 对象分配给 XML 命名空间。
命名空间复习
本文档的一般假设是读者熟悉 XML。然而,回顾一下如何确定 XML 文档中元素或属性所分配的命名空间(如果有)可能是值得的。
首先,除非 XML 文档包含默认命名空间或它所包含的每个元素和属性的命名空间前缀,否则有必要查看相应的 XML 模式。除了任何导入的元素或属性之外,任何元素或属性都是以下之一:
Qualified,这意味着元素或属性位于架构的目标命名空间中。Unqualified,对于元素和属性有不同的含义。不合格的元素不在命名空间中。非限定属性位于其包含元素的默认命名空间(如果有)中。
对于它定义的每个元素和属性,模式指示该项目是合格的还是不合格的。该架构通过以下几部分的组合来实现此目的:
<schema>元素可以指定elementFormDefault和attributeFormDefault属性。这控制模式中任何元素和属性的默认命名空间分配。可能的值为qualified" and "unqualified"。
这些属性是可选的。两者的默认值都是"unqualified"。也就是说,默认情况下,如果使用的元素或属性没有前缀,则它不在命名空间中。
- 其次,元素或属性的定义可以指定表单属性,该属性指示如何将该项目分配给命名空间。可能的值为"
qualified" and "unqualified"。
考虑以下 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<ClassA xmlns="mynamespace" xmlns:s01="mynamespace" s01:String1="abcdef">
<s01:ClassB xmlns="">
<String3>qrstuv</String3>
<String4>wxyz</String4>
</s01:ClassB>
<String2>ghijkl</String2>
</ClassA>
为简单起见,我们假设相应的架构文档使用 elementFormDefault 和 attributeFormDefault 的默认值,并且不为其定义的任何项目指定表单属性。那么本文档中的项目位于命名空间中,如下所示:
-
<ClassA>元素位于mynamespace中,因为以下两项:- 这是由该元素及其直接子元素的默认命名空间声明给出的命名空间
(xmlns="mynamespace")。 <ClassA>元素没有指示其他命名空间的命名空间前缀。
- 这是由该元素及其直接子元素的默认命名空间声明给出的命名空间
-
String1属性位于mynamespace中,因为该属性使用s01前缀,并且xmlns:s01命名空间声明表明s01引用mynamespace命名空间。由于架构使用
attributeFormDefault的默认值(“非限定”),因此即使不使用命名空间前缀,String1属性也将位于mynamespace中。 -
<ClassB>元素位于mynamespace中,因为该属性使用s01前缀。 -
<String3> and <String4>元素不在任何命名空间中,因为以下两点:- 父元素的命名空间声明表明此处的默认命名空间为
null (xmlns="")。 - 这些元素没有指示其他命名空间的命名空间前缀。
- 父元素的命名空间声明表明此处的默认命名空间为
-
元素
<String2>是命名空间mynamespace,因为这是在其父元素中指定的默认命名空间。
XML 命名空间和类
在 IRIS XML 支持中,可以逐类指定命名空间。可以使用 NAMESPACE 类参数来指定该类的实例及其直接子对象的命名空间。此外,还可以使用 ELEMENTQUALIFIED 和 ATTRIBUTEQUALIFIED 参数来指定其对象值属性的属性是全局的(并且与父级属于同一命名空间)还是本地的。
注意:如果文档中未讨论的异常情况需要,还可以将 ELEMENTQUALIFIED 指定为属性参数。
命名空间和上下文
特别是对于命名空间,重要的是要记住,支持 XML 的对象会根据上下文进行不同的处理。例如,如果在顶层导出一个 Address 对象,那么它就是一个Global元素。如果导出包含对 Address 对象的引用的 Person 对象,则 Address 是本地元素(Person 的所有其他属性也是如此)。Global元素和局部元素以不同的方式分配给命名空间。