命名空间的语法:
xmlns:namespace-prefix="namespaceURI"
属性 targetNamespace=“http://www.w3school.com.cn”,声明此 xsd 文件定义的元素的命名空间: “http://www.w3school.com.cn”。类似于 java 中的 package,定义了一个包名。
属性 xmlns=“http://www.w3school.com.cn”,指定默认的命名空间是 “http://www.w3school.com.cn”。类似于 java 中的 import,导入了要使用的类。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
...
xs:schema>
demo 中 targetNamespace 和 xmlns 一样的原因是:
当前 xsd 文件想使用当前 xsd 文件自己定义的元素,需要"自己导入自己",原因是:
xsd 文件定义了一些约束。文件名 user.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.gzn.com"
xmlns="http://www.gzn.com"
elementFormDefault="qualified">
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="phone" type="phone-number"/>
xs:sequence>
xs:complexType>
xs:element>
<xs:simpleType name="phone-number">
<xs:restriction base="xs:string">
<xs:pattern value="1[3|4|5|7|8][0-9]{9}"/>
xs:restriction>
xs:simpleType>
xs:schema>
通过 xmlns=“http://www.gzn.com”,引入了上述 xsd 的 xml 代码
因此可以使用父标签 user 和子标签 name, age, phone。
<user xmlns="http://www.gzn.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.gzn.com http://www.gzn.com user.xsd">
<name>gznname>
<age>18age>
<phone>13166666666phone>
user>
如果将 user.xsd 中的属性 xmlns=“http://www.gzn.com” 删除掉,相当于 user.xsd 文件未导入自己的元素,
就无法识别 phone-number 这个数据类型了,继而在 xml 中的电话号码无法得到校验,
就可以输入不合法的任意号码。
我们把 xmlns="http://www.gzn.com"
改成 xmlns:people="http://www.gzn.com"
,给导入 xsd 命名空间加上了前缀,xml 文件中使用此 xsd 命名空间中定义的元素时,也需要加上同样的前缀,
变成
<people:user xmlns:people="http://www.gzn.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.gzn.com http://www.gzn.com user.xsd">
<people:name>gznpeople:name>
<people:people:age>18people:age>
<people:phone>13166666666people:phone>
people:user>
xsi:schemaLocation 属性是 namespace 为 http://www.w3.org/2001/XMLSchema-instance 里的 schemaLocation 属性。xsi 是指定的命名空间的前缀。
定义了 namespace 和对应的 xsd 文件的位置关系。它的值由一个或多个 url 引用对组成(注意是成对的),两个 url 之间以空白符分隔(空格和换行均可)。
第一个 url 表示想导入的 xsd 文件的 namespace。第二个 url 定义 xsd 文件的位置,schema 解析时将从这个文件位置获取 xsd 文件,第一个 url 必须与该 xsd 文件的 targetNamespace 相匹配。
说明一下"第一个 url 必须与该 xsd 文件的 targetNamespace 相匹配",因为 xsd 文件中 targetNamespace 声明了命名空间(可以理解为 java 中声明了包名),所以第一个 url 需要导入同样的命名空间(可以理解为 java 中按包名 import)。
xsi:schemaLocation 中如果 url 不是偶数个,会报错 url 必须是偶数个。因为偶数个 url 才是成对的。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
beans>
例如下面的 xsd 文件,user 是顶级元素,name 是子元素,user 是 name 的父元素。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.gzn.com"
xmlns="http://www.gzn.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="phone" type="phone-number"/>
xs:sequence>
xs:complexType>
xs:element>
<xs:simpleType name="phone-number">
<xs:restriction base="xs:string">
<xs:pattern value="1[3|4|5|7|8][0-9]{9}"/>
xs:restriction>
xs:simpleType>
xs:schema>