1. Xml命名空间
1.1 XML命名空间XML Namespaces
XML 命名空间提供避免元素命名冲突的方法。XML命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
举例
<f:tablexmlns:f="http://www.w3school.com.cn/furniture">
<h:tablexmlns:h="http://www.w3.org/TR/html4/">
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
注释:标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
1.2 默认的命名空间(Default Namespaces)
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。
xmlns="namespaceURI"
举例
<tablexmlns="http://www.w3.org/TR/html4/">
2 Xml Schema命名空间
2.1 常用命名空间
schema元素引用了三个最常使用的命名空间:
xmlns="http://www.w3c.org/2001/XMLSchema"
xmlns:xsd="http://www.w3c.org/2001/XMLSchema-datatypes"
xsd是XML Schema datatypes的意思
xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instances"
xsi是XML Schema Instances的意思
第二和第三个属性用XML命名空间来标识W3C中的两个XML schema规范。第二个xmlns属性定义了标准的XML schema属性类型例如string, float, integer等。第三个 xmlns属性包含基本的XML schema元素,如element, attribute, complexType, group,simpleType等。
2.2 默认命名空间(default namespaces)
每一个Schema可以有且只有一个默认命名空间
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns=”http://www.w3school.com.cn”
在文档中所有的名字前面如果没有前缀的,就是由默认命名空间进行定义和解析的。使用默认命名空间,可以不加空间前缀。
2.3 <schema>元素
该元素是每一个XML Schema 的根元素。对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含标准命名空间作为命名空间的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。
一个有命名空间schema 声明往往看上去类似这样:
<?xml version="1.0"?>
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
</xs:schema>
无命名空间schema 声明
<xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”
elementFormDefault="qualified">
引入其他
对于标准名字空间和目标名字空间,我们不需要指定它的SchemaLocation。因为对于目标名字空间来讲,SchemaLocation就是文档自己。对于标准名字空间来讲,它是众所周知的,也不需要指定。而对于源目标空间来讲,就需要指定它的SchemaLocation。
<?xml version="1.0"encoding="UTF-8"?>
<schematargetNamespace="http://www.SampleStore.com/Account"
xmlns="http://www.w3.org/1999/xmlSchema"
xmlns:ACC="http://www.SampleStore.com/Account"
xmlns:PART="http://www.PartnerStore.com/PartsCatalog">
<importnamespace="http://www.PartnerStore.com/PartsCatalog"
schemaLocation="http://www.ProductStandards.org/repository/alpha.xsd"/>
</schema>
2.4 <schema>元素属性说明:
2.4.1 源命名空间(source namespaces):带前缀名的
在Schema中的定义和声明也可以引用其他的命名空间,我们可以把这种命名空间取名为源命名空间(source namespaces)。每一个Schema可以有多个源命名空间。
xmlns:xs=http://www.w3.org/2001/XMLSchema
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
2.4.2 目标命名空间(target namespace)
每一个Schema可以有且只有一个目标命名空间。Xml Schema定义文档中(XSD)定义的一系列元素名称,类型名称,属性名称和属性组名称等的有效作用范围就是在他们的目标名字空间(target namespace)中。实际上,在一个给定的Schema中,每一个名称都是属于一个特定的名字空间的。
argetNamespace属性表示了该shema对应的命名空间的URI。也就是说在引用该Schema的其它文档中要声明命名空间的URI应该是targetNamespace的属性值。
2.4.3 elementFormDefault
有效值是 qualified 和unqualified,如果该值是 qualified,实例xml根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace。可以看到引用了Product.xsd的XML文件ProductWithXSD.xml中声明了 xmlns="urn:MyNamespace",声明中没有使用前缀,元素前也就不用添加前缀;如果该值是 unqualified,实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。子元素的命名空间为空命名空间。
3 Xml使用xsd
XML文件和XSD文件没有直接的联系,他们之间通过namespace关联,即
addelement use element
XSD文件-------------------------->namepsae--------------------------->XML文件
3.1 Xsd指定目标命名空间
Xsd文件node.xsd:
<xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”
targetNamespace=”http://www.w3school.com.cn”
xmlns=”http://www.w3school.com.cn” elementFormDefault="qualified">
xml引用
<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">
xml缺省命名空间声明xmlns="值"就是和声明的XML Schema的命名空间相结合来规定该XML文档。
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”定义一个Schema的实例命名空间。只有作了这个定义才能使用schemaLocation属性。
使用小结
Product.xsd文件中targetNamespace="urn:MyNamespace"
Xml引用
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns="urn:MyNamespace"xsi:schemaLocation="urn:MyNamespace空格Product.xsd">
3.2 Xsd没指定目标命名空间
Xsd文件node.xsd:
< schema xmlns =”http://www.w3.org/2001/XMLSchema”
elementFormDefault="qualified">
xml引用
<note xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:noNamespaceSchemaLocation="note.xsd">
note.xsd与xml在同一目录或者相对路径目录。
3.3 Xml引用xsd实例
此文件包含对XML Schema 的引用:
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cnnote.xsd">
…
</note>
下面代码片段
xmlns="http://www.w3school.com.cn"
规定了XML默认命名空间的声明。此声明告知schema验证器,在此XML文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。
下面代码片段
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
定义一个Schema的实例命名空间,(只有作了这个定义才能使用schemaLocation属性)您就可以使用 schemaLocation 属性了。
xsi:schemaLocation="http://www.w3schools.comnote.xsd"
因为我们已经定义了xsi命名空间所以可以使用schemaLocation属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置。schemaLocation属性由成对的值组成可以有多对。(因为一个XML文档可以有多个命名空间,所以schemaLocation值可以有多对)
方式一
xsi:schemaLocation=http://www.w3school.com.cnnote.xsd
方式二
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
方式三
<stusxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="E:\stu.xsd">
3.4 小结
主要区别一:指定命名空间
带命名空间的XSD文件要指定命名空间targetNamespace的值。同样xml文件也要设置该命名空间xmlns;不带命名空间时XSD文件和xml文件都不用设置。
主要区别二:xml设置XSD验证的方式不一样
带命名空间的xml用 schemaLocation="命名空间 xsd文件" 设置不带命名空间的使用noNamespaceSchemaLocation="xsd"文件设置。
小结:无论是xsi :schemaLocation="命名空间 xsd文件" 还是noNamespaceSchemaLocation="xsd文件"都是指的是相对路径。但是不管有没有自定义命名空间,xml和xsd文件都建议放在同一目录下。
找不到xsd文件报错如下:
Unable to load a schemawith target namespace 'http://www.w3school.com.cn' from 'note.xsd'.