Schema中elementFormDefault="qualified"所起的作用
有的xsd文件的开头是这样写的:
<?xml?version="1.0"?>
<xs:schema?xmlns:xs="http://www.w3.org/2001/XMLSchema"
???????????targetNamespace="http://www.abc.com"
???????????xmlns:ps="http://www.abc.com"
???????????elementFormDefault="qualified">
?
一个?XML?schema?中?elementFormDefault="?"?这一属性用来指示?XML?Schema?处理程序把这个?XML?schema?中定义的元素或者类型放到哪个命名空间。一个schema中声明的元素或者类型只能归到两个命名空间中的某一个去,这两个是,无名命名空间和由targetSchema属性指明的目标命名空间。而targetSchema属性只能在xs:schema的定义中声明,因而,一个schema中的定义的元素或类型只可能归属于一个有名命名空间(但是还有可能归属于无名命名空间)。
当elementFormDefault="qualified"?时,所有全局元素的子元素将被以缺省方式放到目标命名空间,连同 全局元素或者类型一起; 而当elementFormDefault="unqualified"?时,所有全局元素的子元素将被以缺省方式放到无名命名空间。而属性的命名空间类似地由attributeFormDefault="?"来指明。需要明白的是,elementFormDefault="?"?是有作用域的,并且是被继承的,除非在子定义中覆盖父定义。
下面三个例子说明了elementFormDefault的使用效果。红色表示属于已命名空间的元素,蓝色表示属于未命名空间的元素。
1.定义了目标命名空间,?全局elementFormDefault=“unqualified”。这时除了全局元素或者类型将归于目标命名空间外,局部元素将归于无名命名空间。
unqualified.xsd
<?xml?version="1.0"?encoding="UTF-8"?>
<xs:schema?xmlns:xs="http://www.w3.org/2001/XMLSchema" ?targetNamespace="aaaa"?elementFormDefault="unqualified" ?attributeFormDefault="unqualified">
?<xs:element?name="c">
??<xs:complexType>
???<xs:sequence>
????<xs:element?name="c1"?type="xs:double"/>
????<xs:element?name="c2"?type="xs:string"/>
???</xs:sequence>
??</xs:complexType>
?</xs:element>
</xs:schema>
unqualified.xml
<?xml?version="1.0"?encoding="UTF-8"?>
<n:c?xmlns:n="aaaa" ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?xsi:schemaLocation="aaaa?unqualified.xsd">
?<c1> 3.141593E0</c1>
?<c2> String</c2>
</n:c>
2.?定义了目标命名空间,?全局elementFormDefault=“qualified”。这时全局元素或者类型将归于目标命名空间,局部元素将以缺省方式归于目标命名空间。
qualified.xsd
<?xml?version="1.0"?encoding="UTF-8"?>
<xs:schema?xmlns:xs="http://www.w3.org/2001/XMLSchema" ?targetNamespace="aaaa"?elementFormDefault="qualified" ?attributeFormDefault="unqualified">
?<xs:element?name="c">
??<xs:complexType>
???<xs:sequence>
????<xs:element?name="c1"?type="xs:double"/>
????<xs:element?name="c2"?type="xs:string"/>
???</xs:sequence>
??</xs:complexType>
?</xs:element>
</xs:schema>
qualified.xml
<?xml?version="1.0"?encoding="UTF-8"?>
<c?xmlns="aaaa" ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?xsi:schemaLocation="aaaa?qualified.xsd">
?<c1> 3.141593E0</c1>
?<c2> String</c2>
</c>
3.?定义了目标命名空间,?全局elementFormDefault=“unqualified”。这时全局元素(c)或者类型将归于目标命名空间。局部元素(c1,c2)以缺省方式归于无名命名空间。局部元素(c3)在局部定义中使用form=“qualified”覆盖全局设定的 unqualified,这使得c3归于目标命名空间(如果它有子元素,子元素将以缺省方式归于目标命名空间)。
qualified2.xsd
<?xml?version="1.0"?encoding="UTF-8"?>
<xs:schema?xmlns:xs="http://www.w3.org/2001/XMLSchema" ?targetNamespace="aaaa"?elementFormDefault="unqualified" ?attributeFormDefault="unqualified">
?<xs:element?name="c">
??<xs:complexType>
???<xs:sequence>
????<xs:element?name="c1"?type="xs:double"/>
????<xs:element?name="c2"?type="xs:string"/>
????<xs:element?name="c3"?type="xs:integer"?form="qualified" />
???</xs:sequence>
??</xs:complexType>
?</xs:element>
</xs:schema>
qualified2.xml
<?xml?version="1.0"?encoding="UTF-8"?>
<n:c?xmlns:n="aaaa" ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?xsi:schemaLocation="aaaa?qualified2.xsd">
?<c1> 3.141593E0</c1>
?<c2> String</c2>
?<n:c3> 0</n:c3>
</n:c>
?
elementFormDefault 属性只是用来设置xml的实例中子元素是否一定需要有命名空间限定,不控制xml实例中各元素归属哪个命名空间。xml实例中元素的命名空间由xml实例本身的设置决定。