第二十一章 指定元素和属性的命名空间
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
元素和局部元素以不同的方式分配给命名空间。