最近在看java ee相关的东西,配置xml肯定是经常要做的一个事情,而配置xml当然是有规则的。
xml Schema 的作用是定义 xml 文档的合法构建模块,类似 DTD,所以Schema 的作用就是限定xml文件怎么去配置,不能随心所欲。java ee感觉就是想把构建软件的很多过程都模块化、自动化,所有的功能都做成了可配置化。

下面介绍如何在 xml 文档中引用 Schema(也就是关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation的介绍),理解的核心是xml文件的命名空间(中间涉及2个xml文件,其中元素有各自的命名空间),首先介绍xml的命名空间,

xml文件的命名空间

在 xml 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
这个 xml文档携带着某个表格中的信息:

<table>
   <tr>
   <td>Applestd>
   <td>Bananastd>
   tr>table>

这个 XML 文档携带有关桌子的信息(一件家具):

<table>
   <name>African Coffee Tablename>
   <width>80width>
   <length>120length>table>

假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的

元素,就会发生命名冲突。XML 解析器无法确定如何处理这类冲突。

可以使用前缀来避免命名冲突,此文档带有某个表格中的信息:

<h:table>
   <h:tr>
   <h:td>Applesh:td>
   <h:td>Bananash:td>
   h:tr>h:table>

此 XML 文档携带着有关一件家具的信息:

<f:table>
   <f:name>African Coffee Tablef:name>
   <f:width>80f:width>
   <f:length>120f:length>f:table>

现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的

元素 ( 和 )。通过使用前缀,我们创建了两种不同类型的

元素。

除了使用前缀,还可以使用命名空间(一个元素可以有多个命名空间,里面带前缀的是特地的命名空间,不带前缀的是默认命名空间),这个 XML 文档携带着某个表格中的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Applesh:td>
   <h:td>Bananash:td>
   h:tr>h:table>

此 XML 文档携带着有关一件家具的信息:

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Tablef:name>
   <f:width>80f:width>
   <f:length>120f:length>f:table>

与仅仅使用前缀不同,我们为

标签添加了一个 xmlns (xml namespace)属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称,下面是xml文件中xmlns属性的使用介绍,

XML Namespace (xmlns) 属性
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix=”namespaceURI”

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
注意,用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

Schema对应的xml文件

首先,需要注意的是Schema也是个xml文件,所以它也有自己的命名空间,

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.w3school.com.cn"xmlns="http://www.w3school.com.cn"elementFormDefault="qualified">......

其中,

xmlns:xs="http://www.w3.org/2001/XMLSchema"

表示给这个xml中schema定义了一个命名空间http://www.w3.org/2001/XMLSchema,xs为使用时的前缀。

targetNamespace="http://www.w3school.com.cn"

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn",即这个schema是为”http://www.w3school.com.cn“命名空间所提供约束的,也就是被声明为http://www.w3school.com.cn命名空间的xml文件所引用。

xmlns="http://www.w3school.com.cn"

指出schema 中元素的默认的命名空间是 "http://www.w3school.com.cn"。

在 XML 文档中引用 Schema

此 XML 文档含有对 XML Schema 的引用:

<note xmlns="http://www.w3school.com.cn"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.w3school.com.cn note.xsd"><to>Georgeto><from>Johnfrom><heading>Reminderheading><body>Don't forget the meeting!body>note>

其中,

xmlns="http://www.w3school.com.cn"

定义了该xml元素的默认命名空间为http://www.w3school.com.cn,

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

又定义了一个命名空间(貌似这玩意官方叫XML Schema 实例命名空间),和前缀xsi关联,

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

设置xsi前缀代表的命名空间中的一个属性schemaLocation为"http://www.w3school.com.cn note.xsd"(XML Schema 实例命名空间下的schemaLocation属性,该属性貌似被schema 验证器读取?名称是固定的?)。
此属性有两个值,第一个值是需要使用的命名空间,第二个值是供命名空间使用的 XML schema 的位置(note.xsd就是根元素为schema的那个xml文件),其实也就是表示命名空间为http://www.w3school.com.cn的xml元素(文件)对应的Schema的位置(文件)为note.xsd,所以Schema中的targetNamespace属性值必须和xsi:schemaLocation属性的第一个值相同,这里都为http://www.w3school.com.cn(需要引用schema的xml中定义的命名空间为第一个值,表示它要被shema限制)。