天天看点

XML(1)——shema约束之命名空间

一、XML的两种约束DTD和Schema

摘自IBM官网一段话:“XML DTD(XML的文档类型定义)是近几年来XML技术领域所使用的最广泛的一种模式。但是由于XML DTD并不能完全满足XML自动化处理的要求,例如不能很好实现应用程序不同模间的相互协调,缺乏对文档结构、属性、数据类型等约束的足够描述等等,所以W3C于2001年5月正式推荐XML Schema为XML 的标准模式。显然,W3C希望以XML Schema来作为XML模式描述语言的主流,并逐渐代替XML DTD”。可见Schema使用的越来越多,本文先阐述Shema约束中非常重要的概念命名空间。

二、shema文件

student.xsd

<?xml version="1.0" encoding="UTF-8"?>

<schema

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

targetNamespace="http://www.example.org/student"

elementFormDefault="qualified">

<element name="student">

<complexType>

<sequence>

<element name="num" type="int" />

<element name="name" type="string" />

<element name="birthday" type="date" />

</sequence>

</complexType>

</element>

</schema>

student.xsd就是一个shema文件,本身也是XML格式的,也要符合一定的约束。通过几个问题来理解xmlns和targetNamespace。

问题1如何保证shema文件唯一性:targetNamespace

因为在引用shema文件作为xml约束时,试想若有多个shema文件同名以哪一个约束为准呢?所以shema通过命名空间的概念来确保唯一性,targetNamespace属性就是指定这个xsd的命名空间的。通常使用url的形式作为targetNamespace的值来确保唯一性,而该url通常并不一定存在。

问题2如何引入shema规范:xmlns

xsd所有的标签和属性也必须符合schema规范,那element、complexType、sequence等标签的规范从何而来呢?通过xmlns属性来指定shema约束。xmlns="http://www.w3.org/2001/XMLSchema"就表示student.xsd默认不加前缀的标签和属性必须符合w3s定义的一个schema约束。若shema文件不是w3c组织定义的就需要指定shema文件的位置。下面xml引入student.xsd约束时有介绍。

问题3elementFormDefault是什么意思

该属性是一个枚举值:qualified、unqualified。默认是unqualified表示只关联根标签student,而qualified表示关联所有标签和属性如num,name,birthday。

三、XML文件引入约束

方法1

student.xml

<student xmlns="http://www.example.org/student" 

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

xsi:schemaLocation="http://www.example.org/student student.xsd">

<num>1000</num>

<name>xy</name>

<birthday>2000-01-01</birthday>

</student>

student.xml指定了xmlns="http://www.example.org/student"约束,就是自定义的student.xsd。但正如问题②所说shema文件不是w3c组织定义的就需要指定shema文件的位置。

问题4如何指定xsd位置:schemaLocation

通过schemaLocation指定shema文件位置。但schemaLocation属性由http://www.w3.org/2001/XMLSchema-instance约束,所以需要再通过xmlns引入这个约束。但一个标签中只允许一个不带前缀的xmlns标签,所以要给新的xmlns带一个前缀xsi,前缀名自定义。以下的例子很好的说明了前缀的用法:

<xy:student

xmlns:xy="http://www.example.org/student"

<xy:num>1000</xy:num>

<xy:name>xy</xy:name>

<xy:birthday>2000-01-01</xy:birthday>

</xy:student>

方法2

没有通过指定shema的命名空间而是xsd问位置来确定约束。

xmlns:xy="http://www.example.org/student" 

xsi:noNamespaceSchemaLocation="/studnet.xsd">

首段摘自:http://www.ibm.com/developerworks/cn/xml/x-sd/

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1416824如需转载请自行联系原作者

woshixuye111