在上一篇文章《XSD简介》中,列举了一个简单的XSD的例子。其中,xs:schema元素有一个elementFormDefault属性,关于此属性的作用,很多人都不是很清楚。
schema中定义的元素或者类型会放到命名空间中去,而命名空间是通过targetNamespace属性来定义的,又因为只有schema元素有targetNamespace属性,所以schema中定义的元素或者类型只能放到targetNamespace元素指定的命名空间或者无名命名空间中。 而schema元素中的elementFormDefault属性,其作用就是决定schema中定义的元素或类型放到哪个命名空间中,可选值有两个:qualified和unqualified。
当elementFormDefault为qualified时,全局元素及其所有子元素或类型都会被放到targetNamespace指定的命名空间中。
copy.xsd
<?xml version="1.0" encoding="UTF8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="my.xsd.ns"
xmlns="my.xsd.ns"
elementFormDefault="qualified" >
<xs:element name="copy">
<xs:complexType>
<xs:sequence>
<xs:element name="from" type="xs:string"/>
<xs:element name="to" type="xs:string" />
<xs:element name="force" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
copy.xml有两种写法:
<?xml version="1.0" encoding="UTF8"?>
<n:copy xmlns:n="my.xsd.ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="my.xsd.ns copy.xsd" >
<from>D:\\test</from>
<n:to>E:\\document</n:to>
<n:force>true</n:force>
</n:copy>
<?xml version="1.0" encoding="UTF8"?>
<copy xmlns="my.xsd.ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="my.xsd.ns copy.xsd" >
<from>D:\\test</from>
<to>E:\\document</to>
<force>true</force>
</copy>
当elementFormDefault为unqualified(默认值)时,不需要设置targetNamespace属性,所有的元素或类型都会被放到无名命名空间中。
copy.xsd
<?xml version="1.0" encoding="UTF8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="copy">
<xs:complexType>
<xs:sequence>
<xs:element name="from" type="xs:string" />
<xs:element name="to" type="xs:string" />
<xs:element name="force" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
copy.xml
<?xml version="1.0" encoding="UTF8"?>
<copy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="my.xsd.ns ../copy.xsd" >
<from>D:\\test</from>
<to>E:\\document</to>
<force>true</force>
</copy>