您的位置:首页 > 其它

WebService从零到项目开发使用1—技术研究之基础篇 XML

2013-08-07 10:00 429 查看


1. 基础篇


1.1. XML


1.1.1. XML 基础

1. XML简介

XML用来传输和存储数据,HTML是用来显示数据。XML 是对 HTML 的补充。XML 是独立于软件和硬件的信息传输工具。可扩展标记语言 (XML) 于 1998 年 2 月 10 日成为 W3C 的推荐标准。目前,XML 在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML。XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

1) 什么是XML

XML 指可扩展标记语言(EXtensible Markup Language);

XML 是 W3C 的推荐标准;

XML 是一种标记语言,很类似 HTML;

XML 的设计宗旨是传输数据,而非显示数据;

XML 标签没有被预定义。您需要自行定义标签;

XML 被设计为具有自我描述性;

2) 没有任何行为的 XML

XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面是 John 写给Andy 的便签,存储为XML:
<note>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

上面的这条便签具有自我描述性。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

3) XML 仅仅是纯文本

XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。

4) 自定义标签

上例中的标签没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由文档的创作者发明的。这是因为 XML 没有预定义的标签。在 HTML 中使用的标签是预定义的,HTML 文档只使用在 HTML 标准中定义过的标签。XML 允许创作者定义自己的标签和自己的文档结构。

2. XML的用途

1) 把数据从 HTML 分离

如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。我们可以通过使用JavaScript读取一个外部 XML 文件,然后更新 HTML 中的数据内容。

2) 简化数据共享

在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。

3) 简化数据传输

通过 XML,可以在不兼容的系统之间轻松地交换数据。对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。

4) 简化平台的变更

升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的系统、新应用程序或新的浏览器。

5) 使数据更有用

由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。

6) XML 用于创建新的Internet 语言

很多新的 Internet 语言是通过 XML 创建的,包括:

l XHTML - 最新的 HTML 版本

l WSDL - 用于描述可用的 web service

l WAP 和 WML - 用于手持设备的标记语言

l RSS - 用于 RSS feed 的语言

l RDF 和 OWL - 用于描述资源和本体

l SMIL - 用于描述针针对 web 的多媒体

后话,未来也许会出现某种字处理软件、电子表格程序以及数据库,它们可以使用纯文本格式读取彼此的数据,而不需要使用任何的转换程序。祈祷所有软件开发商在这一方面取得一致。

3. XML树结构

1) 一个 XML 文档实例

XML 使用简单的具有自我描述性的语法:
<?xml version="1.0" encoding="ISO-8859-1"?>

<note>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。下一行描述文档的根元素,接下来 4 行描述根的 4 个子元素,最后一行定义根元素的结尾。

XML 具有出色的自我描述性。

2) XML 文档形成一种树结构

上图表示下面的 XML 中的一本书:
<bookstore>

<book category="COOKING">

<title lang="en">Everyday Italian</title>

<author>Giada De Laurentiis</author>

<year>2005</year>

<price>30.00</price>

</book>

<book category="CHILDREN">

<title lang="en">Harry Potter</title>

<author>J K. Rowling</author>

<year>2005</year>

<price>29.99</price>

</book>

</bookstore>

4. XML语法规则

1) 所有 XML 元素都须有关闭标签

在 HTML,经常会看到没有关闭标签的元素,在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签:
<p>This is a paragraph</p>

<p>This is another paragraph</p>

注释:XML 声明没有关闭标签。这不是错误。声明不属于XML本身的组成部分。

2) XML 标签对大小写敏感

XML 元素使用 XML 标签进行定义。XML 标签对大小写敏感。在 XML 中,标签 <Letter> 与标签 <letter> 是不同的。必须使用相同的大小写来编写打开标签和关闭标签:
<Message>这是错误的。</message>

<message>这是正确的。</message>

3) XML 必须正确地嵌套

在 HTML 中,常会看到没有正确嵌套的元素:

<b><i>This text is bold anditalic</b></i>

在 XML 中,所有元素都必须彼此正确地嵌套:

<b><i>This text is bold anditalic</i></b>

4) XML 文档必须有根元素

XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。

5) XML 的属性值须加引号

与 HTML 类似,XML 也可拥有属性(名称/值的对)。在 XML 中,XML 的属性值须加引号。

6) 实体引用

在 XML 中,一些字符拥有特殊的意义。如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

这样会产生 XML 错误:

<message>if salary < 1000 then</message>

为了避免这个错误,请用实体引用来代替 "<" 字符:

<message>if salary < 1000 then</message>
<
<
小于
>
>
大于
&
&
和号
'
'
单引号
"
"
引号
注释:在 XML 中,只有字符"<"和"&"确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

7) 在 XML 中,空格会被保留

HTML 会把多个连续的空格字符裁减(合并)为一个:

HTML: Hello my name is David.

输出: Hello my name isDavid.

在 XML 中,文档中的空格不会被删节。

8) XML 以 LF 存储换行

在 Windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符(LF)。在 Unix 应用程序中,新行以LF字符存储。而
Macintosh 应用程序使用 CR 来存储新行。

5. XML元素

1) XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。

2) XML 命名规则

XML 元素必须遵循以下命名规则:

l 名称可以含字母、数字以及其他的字符

l 名称不能以数字或者标点符号开始

l 名称不能以字符 “xml”(或者 XML、Xml)开始

l 名称不能包含空格

l 可使用任何名称,没有保留的字词。

使名称具有描述性。使用下划线的名称也很不错。

名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>。

避免"-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为你需要提取第一个单词。

避免"." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。

避免":" 字符。冒号会被转换为命名空间来使用。

3) XML 元素是可扩展的

XML 元素是可扩展,以携带更多的信息。请看下面这个 XML 例子:
<note>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

让我们设想一下,我们创建了一个应用程序,可将 <to>、<from> 以及 <body> 元素提取出来,并产生以下的输出:
MESSAGE

To: Andy

From: John

Don't forget the meeting!

想象一下,之后又向这个文档添加了一些额外的信息:
<note>

<date>2008-08-08</date>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

那么这个应用程序会中断或崩溃吗?

不会。这个应用程序仍然可以找到 XML 文档中的 <to>、<from> 以及 <body> 元素,并产生同样的输出。

XML 的优势之一,就是可以经常在不中断应用程序的情况进行扩展。

6. XML属性

1) 属性 (Attribute) 提供关于元素的额外(附加)信息。

2) 属性值必须被引号包围,不过单引号和双引号均可使用。

3) 如果属性值本身包含双引号,那么有必要使用单引号包围它,例子:
<gangster name='George "Shotgun" Ziegler'>

或者可以使用实体引用:

<gangster name="George "Shotgun" Ziegler">

4) 我的经验是在 HTML 中,属性用起来很便利,但是在XML中,应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用子元素。

请看这些例子:
例子1

<person sex="female">

<firstname>Anna</firstname>

<lastname>Smith</lastname>

</person>

例子2

<person>

<sex>female</sex>

<firstname>Anna</firstname>

<lastname>Smith</lastname>

</person>

在例子1中,sex 是一个属性。在例子2中,sex 则是一个子元素。两个例子均可提供相同的信息。

下面的三个 XML 文档包含完全相同的信息:

第一个例子中使用了 date 属性:
<note date="08/08/2008">

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

第二个例子中使用了 date 元素:
<note>

<date>08/08/2008</date>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

第三个例子中使用了扩展的 date 元素
<note>

<date>

<day>08</day>

<month>08</month>

<year>2008</year>

</date>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

5) 避免 XML 属性

l 因使用属性而引起的一些问题:

l 属性无法包含多重的值(元素可以)

l 属性无法描述树结构(元素可以)

l 属性不易扩展(为未来的变化)

l 属性难以阅读和维护

请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。不要做这样的蠢事(这不是 XML 应该被使用的方式):
<note day="08" month="08" year="2008"

to="George" from="John" heading="Reminder" body="Don't forget the meeting!">

……

</note>

6) 有时候会向元素分配 ID 引用。这些 ID 索引可用于标识 XML 元素,它起作用的方式与 HTML 中 ID 属性是一样的。D 仅仅是一个标识符,用于标识不同的标签。它并不是标签数据的组成部分。在此极力向您传递的理念是:元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素

7. XML验证

拥有正确语法的XML被称为“格式良好”的XML。

通过 DTD验证的 XML是“合法”的 XML。

1) 形式良好的 XML 文档

“结构良好”的 XML 文档拥有正确的语法,遵守前几章介绍过的 XML 语法规则:

l XML 文档必须有根元素

l XML 文档必须有关闭标签

l XML 标签对大小写敏感

l XML 元素必须被正确的嵌套

l XML 属性必须加引号

2) 验证 XML 文档

合法的 XML 文档是“结构良好”的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则:
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE note SYSTEM "Note.dtd">

<note>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

在上例中,DOCTYPE 声明是对外部 DTD 文件的引用。下面的段落展示了这个文件的内容。

3) XML DTD

DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:
<!DOCTYPE note [

<!ELEMENT note (to,from,heading,body)>

<!ELEMENT to (#PCDATA)>

<!ELEMENT from (#PCDATA)>

<!ELEMENT heading (#PCDATA)>

<!ELEMENT body (#PCDATA)>

]>

4) XML Schema

W3C 支持一种基于 XML 的 DTD 代替者,它名为 XML Schema:
<xs:element name="note">

<xs:complexType>

<xs:sequence>

<xs:element name="to" type="xs:string"/>

<xs:element name="from" type="xs:string"/>

<xs:element name="heading" type="xs:string"/>

<xs:element name="body" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

8. XML验证器

1) XML 错误会终止程序

XML 文档中的错误会终止你的 XML 程序。

W3C 的 XML 规范声明:如果 XML 文档存在错误,那么程序就不应当继续处理这个文档。理由是,XML 软件应当轻巧,快速,具有良好的兼容性。

如果使用 HTML,创建包含大量错误的文档是有可能的(比如你忘记了结束标签)。其中一个主要的原因是 HTML 浏览器相当臃肿,兼容性也很差,并且它们有自己的方式来确定当发现错误时文档应该显示为什么样子。

2) 对XML 进行语法检查

可根据 DTD 来验证 XML,也可以自行开发验证器。

注释:只有在 Internet Explorer 中,可以根据 DTD 来验证 XML。Firefox, Mozilla, Netscape 以及 Opera 做不到这一点。

3) XML浏览器支持

几乎所有的主流浏览器均支持 XML 和 XSLT。

Mozilla Firefox

从 1.0.2 版本开始,Firefox 就已开始支持 XML 和 XSLT(包括 CSS)。

Mozilla

Mozilla 含有用于 XML 解析的 Expat,并支持显示 XML +CSS。Mozilla 同时拥有对 Namespaces 的某些支持。Mozilla 同样可做到对 XSLT 的执行(XSLT implementation)。

Netscape

自从版本 8 开始,Netscape 开始使用 Mozilla 的引擎,因此它对 XML/ XSLT 的支持与 Mozilla 是相同的。

Opera

自从版本 9 开始,Opera 已经拥有对 XML /XSLT(以及 CSS)的支持。版本 8 仅支持 XML + CSS。

InternetExplorer

自从版本 6 开始,InternetExplorer 就开始支持 XML、Namespaces、CSS、XSLT 以及 XPath。

4) 使用 CSS 显示 XML

通过使用 CSS,可为 XML 文档添加显示信息。使用 CSS 来格式化 XML 文档。下面的例子是关于如何使用CSS样式表来格式化XML文档:

这是 XML 文件:
<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/css" href="cd_catalog.css"?>

<CATALOG>

<CD>

<TITLE>Empire Burlesque</TITLE>

<ARTIST>Bob Dylan</ARTIST>

<COUNTRY>USA</COUNTRY>

<COMPANY>Columbia</COMPANY>

<PRICE>10.90</PRICE>

<YEAR>1985</YEAR>

</CD>

<CD>

<TITLE>Hide your heart</TITLE>

<ARTIST>Bonnie Tyler</ARTIST>

<COUNTRY>UK</COUNTRY>

<COMPANY>CBS Records</COMPANY>

<PRICE>9.90</PRICE>

<YEAR>1988</YEAR>

</CD>

</CATALOG>

这是样式表CSS 文件:
CATALOG

{

background-color: #ffffff;

width: 100%;

}

CD

{

display: block;

margin-bottom: 30pt;

margin-left: 0;

}

TITLE

{

color: #FF0000;

font-size: 20pt;

}

ARTIST

{

color: #0000FF;

font-size: 20pt;

}

COUNTRY,PRICE,YEAR,COMPANY

{

display: block;

color: #000000;

margin-left: 20pt;

}

最后,请查看效果:由 CSS 文件格式化的 CD 目录

注释:使用 CSS格式化XML不是常用的方法,W3C推荐使用XSLT。

5) 使用 XSLT 显示 XML

通过使用 XSLT,你可以向 XML 文档添加显示信息。

XSLT 是首选的 XML 样式表语言。

XSLT (eXtensible Stylesheet Language Transformations) 远比 CSS 更加完善。

使用 XSLT 的方法之一是在浏览器显示XML 文件之前,先把它转换为HTML,正如以下的这些例子:

查看 XML 文件
<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href="simple.xsl"?>

<breakfast_menu>

<food>

<name>Belgian Waffles</name>

<price>$5.95</price>

<description>

two of our famous Belgian Waffles

</description>

<calories>650</calories>

</food>

</breakfast_menu>

XSLT 样式表
<?xml version="1.0" encoding="ISO-8859-1"?>

<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns="http://www.w3.org/1999/xhtml">

<body style="font-family:Arial,helvetica,sans-serif;font-size:12pt;

background-color:#EEEEEE">

<xsl:for-each select="breakfast_menu/food">

<div style="background-color:teal;color:white;padding:4px">

<span style="font-weight:bold;color:white">

<xsl:value-of select="name"/></span>

- <xsl:value-of select="price"/>

</div>

<div style="margin-left:20px;margin-bottom:1em;font-size:10pt">

<xsl:value-of select="description"/>

<span style="font-style:italic">

(<xsl:value-of select="calories"/> calories per serving)

</span>

</div>

</xsl:for-each>

</body>

</html>

查看结果

6) 在服务器上通过 XSLT 转换 XML

在上例中,XSLT 转换是由浏览器完成的,浏览器读取的是 XML 文件。

在使用 XSLT 来转换 XML 时,不同的浏览器可能会产生不同结果。为了减少这种问题,可以在服务器上进行XSLT转换。

请注意,不论转换由服务器还是由浏览器进行,输出结果完成相同。


1.1.2. XML Javascript

1. XMLHttpRequest 对象

XMLHttpRequest 对象用于在后台与服务器交换数据。

1) XMLHttpRequest 对象支持:

l 在不重新加载页面的情况下更新网页

l 在页面已加载后从服务器请求数据

l 在页面已加载后从服务器接收数据

l 在后台向服务器发送数据

2) 所有现代的浏览器都支持 XMLHttpRequest 对象。

3) 任何 W3C 推荐标准均未规定 XMLHttpRequest 对象。
<script type="text/javascript">

var xmlhttp;

function loadXMLDoc(url)

{

xmlhttp=null;

if (window.XMLHttpRequest)

{// code for all new browsers

xmlhttp=new XMLHttpRequest();

}

else if (window.ActiveXObject)

{// code for IE5 and IE6

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

if (xmlhttp!=null)

{

xmlhttp.onreadystatechange=state_Change;

xmlhttp.open("GET",url,true);

xmlhttp.send(null);

}

else

{

alert("Your browser does not support XMLHTTP.");

}

}

function state_Change()

{

if (xmlhttp.readyState==4)

{// 4 = "loaded"

if (xmlhttp.status==200)

{// 200 = OK

// ...our code here...

}

else

{

alert("Problem retrieving XML data");

}

}

}

</script>

2. XML解析器

1) 所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器。解析器把 XML 转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。解析器把 XML 载入内存,然后把它转换为可通过 JavaScript 访问的 XML DOM 对象。

2) 实例:加载并解析XML文件
<script type="text/javascript">

if (window.XMLHttpRequest)

{// code for IE7+, Firefox, Chrome, Opera, Safari

xmlhttp=new XMLHttpRequest();

}

else

{// code for IE6, IE5

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

xmlhttp.open("GET","/example/xmle/note.xml",false);

xmlhttp.send();

xmlDoc=xmlhttp.responseXML;

document.getElementById("to").innerHTML=

xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;

document.getElementById("from").innerHTML=

xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;

document.getElementById("message").innerHTML=

xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;

</script>

3) 实例加载并解析XML串
<script>

txt="<note>";

txt=txt+"<to>George</to>";

txt=txt+"<from>John</from>";

txt=txt+"<heading>Reminder</heading>";

txt=txt+"<body>Don't forget the meeting!</body>";

txt=txt+"</note>";

if (window.DOMParser)

{

parser=new DOMParser();

xmlDoc=parser.parseFromString(txt,"text/xml");

}

else // Internet Explorer

{

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

xmlDoc.async="false";

xmlDoc.loadXML(txt);

}

document.getElementById("to").innerHTML=xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;

document.getElementById("from").innerHTML=xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;

document.getElementById("message").innerHTML=xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;

</script>

3. 由 HTML 和 JavaScript 可构建一个小型 XML 应用程序。


1.1.3. XML 高级

1. XML命名空间

XML 命名空间提供避免元素命名冲突的方法。在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。XML 解析器无法确定如何处理这类冲突。

1) 使用前缀来避免命名冲突
文档1

<h:table>

<h:tr>

<h:td>Apples</h:td>

<h:td>Bananas</h:td>

</h:tr>

</h:table>

文档2

<f:table>

<f:name>African Coffee Table</f:name>

<f:width>80</f:width>

<f:length>120</f:length>

</f:table>

现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。

通过使用前缀,我们创建了两种不同类型的<table>元素。

2) 使用命名空间(Namespaces)
文档1

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

<h:tr>

<h:td>Apples</h:td>

<h:td>Bananas</h:td>

</h:tr>

</h:table>

文档2

<f:table xmlns:f="http://www.w3school.com.cn/furniture">

<f:name>African Coffee Table</f:name>

<f:width>80</f:width>

<f:length>120</f:length>

</f:table>

与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。

3) XML Namespace (xmlns) 属性

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

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

可以访问 http://www.w3.org/TR/html4/。
4) 默认的命名空间(Default Namespaces)

为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。

请使用下面的语法:

xmlns="namespaceURI"
文档1

<table xmlns="http://www.w3.org/TR/html4/">

<tr>

<td>Apples</td>

<td>Bananas</td>

</tr>

</table>

文档2

<table xmlns="http://www.w3school.com.cn/furniture">

<name>African Coffee Table</name>

<width>80</width>

<length>120</length>

</table>

5) 命名空间的实际应用

当开始使用 XSL 时,您不久就会看到实际使用中的命名空间。XSL 样式表用于将 XML 文档转换为其他格式,比如 HTML。

如果仔细观察下面的这个 XSL 文档,就会看到大多数的标签是HTML标签。非 HTML 的标签都有前缀 xsl,并由此命名空间标示:http://www.w3.org/1999/XSL/Transform

XSLT 样式表:
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<html>

<body>

<h2>My CD Collection</h2>

<table border="1">

<tr>

<th align="left">Title</th>

<th align="left">Artist</th>

</tr>

<xsl:for-each select="catalog/cd">

<tr>

<td><xsl:value-of select="title"/></td>

<td><xsl:value-of select="artist"/></td>

</tr>

</xsl:for-each>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

2. XML CDATA

所有 XML 文档中的文本均会被解析器解析,只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

1) PCDATA

PCDATA 指的是被解析的字符数据(ParsedCharacter Data)。XML 解析器通常会解析 XML 文档中所有的文本。当某个 XML 元素被解析时,其标签之间的文本也会被解析。

2) CDATA

CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。在 XML 元素中,"<"和 "&" 是非法的。"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。CDATA 部分中的所有内容都会被解析器忽略。

CDATA "<![CDATA["xxxxx"]]>"
<script>

<![CDATA[

function matchwo(a,b)

{

if (a < b && a < 0) then

{

return 1;

}

else

{

return 0;

}

}

]]>

</script>

l CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。

l 标记 CDATA 部分结尾的"]]>" 不能包含空格或折行。

3. XML 编码

XML 文档可以包含非 ASCII 字符,比如法语。为了避免错误,需要规定 XML 编码,或者将 XML 文档存为Unicode

1) Windows 记事本

Windows 记事本默认会将文件保存为单字节的 ANSI (ASCII)。如果选取文件菜单中的“另存为”命令,就可以规定双字节 Unicode (UTF-16)(注意文档不包含任何 encoding 属性)。以双字节存储后如果规定了单字节编码打开就会出错。

2) 如果您的文件被保存为 Unicode/UTF-16,但是编码属性被指定为单字节编码(比如 Windows-1252、ISO-8859-1 或者 UTF-8)时,那么您就会得到错误消息。或者当您的文档被保存为单字节编码,但编码属性被指定为双字节编码(比如 UTF-16)时,也会得到错误消息。

4. Internet Explorer - XML 数据岛

XML 数据岛(XML Data Islands)是嵌入 HTML 页面中的 XML 数据。要避免使用它,XML数据岛只在 Internet Explorer 浏览器中有效。替代它:在 HTML 中使用 JavaScript 和 XML DOM 来解析并显示 XML数据。

实例:

把 XML 文档绑定到 HTML 文档中的一个 <xml> 标签。id 属性定义数据岛的标识符,而 src 属性指向 XML 文件
<html>

<body>

<xml id="cdcat" src="cd_catalog.xml"></xml>

<table border="1" datasrc="#cdcat">

<tr>

<td><span datafld="ARTIST"></span></td>

<td><span datafld="TITLE"></span></td>

</tr>

</table>

</body>

</html>

<table> 标签的 datasrc 属性把 HTML 表格绑定到 XML 数据岛。

<span> 标签允许 datafld 属性引用要显示的XML元素。在这个例子中,要引用的是"ARTIST" 和 "TITLE"。当读取 XML 时,会为每个 <CD> 元素创建相应的表格行。

如果您正在使用 InternetExplorer,可以亲自试一试。

5. 把数据存储到 XML 文件

通常,我们在数据库中存储数据。不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中。

1) 创建并保存 XML 文件

如果数据要被传送到非 Windows 平台上的应用程序,那么把数据保存在 XML 文件中是有好处的。请记住,XML 有很强的跨平台可移植性,并且数据无需转换。可使用Java或者ASP脚本语言编写创建和保存XML文件的代码。下面是微软平台下的ASP代码:
<%

Dim xmlDoc, rootEl, child1, child2, p

'创建XML文档

Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")

'创建根元素并将之加入文档

Set rootEl = xmlDoc.createElement("root")

xmlDoc.appendChild rootEl

'创建并加入子元素

Set child1 = xmlDoc.createElement("child1")

Set child2 = xmlDoc.createElement("child2")

rootEl.appendChild child1

rootEl.appendChild child2

'创建 XML processing instruction

'并把它加到根元素之前

Set p=xmlDoc.createProcessingInstruction("xml","version='1.0'")

xmlDoc.insertBefore p,xmlDoc.childNodes(0)

'把文件保存到 C 目录

xmlDoc.Save "c:\test.xml"

%>

2) 扩展上一个例子,我们可以把使用HTML开发一个表单,然后将提交的数据保存到XML文件中。

6. XML的相关技术

1) XHTML

更严格更纯净的基于 XML 的 HTML 版本。

2) XML DOM

访问和操作 XML 的标准文档模型。

3) XSLT

XSL 包含三个部分:

l XSLT - 把 XML 转换为其他格式,比如 HTML

l XSL-FO - 用于格式化 XML 文档的语言

l XPath - 用于在 XML 文档中导航的语言

4) XQuery

基于 XML 的用于查询 XML 数据的语言。

5) DTD

用于定义 XML 文档中的合法元素的标准。

6) XSD

XML Schema。基于 XML 的 DTD 替代物。

7) XLink

在 XML 文档中创建超级链接的语言。

8) XPointer

允许 XLink 超级链接指向 XML 文档中更多具体的部分。

9) XForms

使用 XML 定义表单数据。

10) SOAP

允许应用程序在 HTTP 之上交换信息的基于 XML 的协议。

11) WSDL

用于描述网络服务的基于 XML 的语言。

12) RDF

用于描述网络资源的基于 XML 的语言。

13) RSS

聚合新闻以及类新闻站点内容的格式。

14) WAP

用于在无线设备上(比如移动电话)显示内容的一种基于 XML 的语言。

15) SMIL

描述视听呈现的语言。

16) SVG

使用 XML 格式定义图形。


1.1.6. XML Schema

XML Schema 是基于 XML 的 DTD 替代者。XMLSchema 描述XML 文档的结构。XML
Schema 语言也称作 XMLSchema 定义(XML Schema Definition,XSD)。

1.1.1. XML Schema 基础

1. XML Schema简介

1) XML Schema 的作用是定义 XML 文档的合法构建模块,类似DTD。

2) XML Schema用于:

l 定义可出现在文档中的元素

l 定义可出现在文档中的属性

l 定义哪个元素是子元素

l 定义子元素的次序

l 定义子元素的数目

l 定义元素是否为空,或者是否可包含文本

l 定义元素和属性的数据类型

l 定义元素和属性的默认值以及固定值

3) XML Schema 很快会在大部分网络应用程序中取代 DTD。理由如下:

l XML Schema 可针对未来的需求进行扩展

l XML Schema 更完善,功能更强大

l XML Schema 基于 XML 编写

l XML Schema 支持数据类型

l XML Schema 支持命名空间

4) XML Schema 是 W3C 标准。

2. 使用 XML Schema的原因

1) XML Schema 比 DTD 更强大。

2) XML Schema 支持数据类型:

l 可更容易地描述允许的文档内容

l 可更容易地验证数据的正确性

l 可更容易地与来自数据库的数据一并工作

l 可更容易地定义数据约束(datafacets)

l 可更容易地定义数据模型(或称数据格式)

l 可更容易地在不同的数据类型间转换数据

3) XML Schema 使用 XML 语法

XML Schema是由 XML 编写的,由 XML 编写 XML Schema 有很多好处:

l 不必学习新的语言

l 可使用 XML 编辑器来编辑 Schema文件

l 可使用 XML 解析器来解析 Schema文件

l 可通过 XML DOM 来处理 Schema

l 可通过 XSLT 来转换 Schema

4) XML Schema 可保护数据通信

当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。通过 XML Schema,发送方可以用一种接受方能够明白的方式来描述数据。

一种数据,比如 "03-11-2004",在某些国家被解释为11月3日,而在另一些国家为当作3月11日。但是一个带有数据类型的XML 元素,比如:

<datetype="date">2004-03-11</date>,可确保对内容一致的理解,这是因为 XML 的数据类型 "date" 要求的格式是 "YYYY-MM-DD"。

5) XML Schema 可扩展

XML Schema 是可扩展的,因为它们由 XML 编写。通过可扩展的 Schema 定义:

l 在其他 Schema 中重复使用您的Schema

l 创建由标准类型衍生而来的您自己的数据类型

l 在相同的文档中引用多重的Schema

6) 形式良好是不够的

我们把符合 XML 语法的文档称为形式良好的 XML 文档。即使文档的形式良好,仍然不能保证它们不会包含错误,并且这些错误可能会产生严重的后果。

3. 使用XSD的方法

XML 文档可对 DTD 或 XML Schema 进行引用。


1) 一个简单的 XML 文档:

<?xml version="1.0"?>

<note>

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

2) DTD 文件

下面这个例子是名为 "note.dtd" 的 DTD 文件,它对上面那个 XML 文档的元素进行了定义:(元素的类型是"#PCDATA")

<!ELEMENT note (to, from, heading, body)>

<!ELEMENT to (#PCDATA)>

<!ELEMENT from (#PCDATA)>

<!ELEMENT heading (#PCDATA)>

<!ELEMENT body (#PCDATA)>

3) XML Schema

4) 下面这个例子是一个名为 "note.xsd" 的 XML Schema 文件,它定义了上面那个 XML 文档的元素:

<?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:element name="note">

<xs:complexType>

<xs:sequence>

<xs:element name="to" type="xs:string"/>

<xs:element name="from" type="xs:string"/>

<xs:element name="heading" type="xs:string"/>

<xs:element name="body" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

note 元素是一个复合类型,因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素。

5) 对 XML Schema 的引用

<?xml version="1.0"?>

<note

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

<!—以下告知XML解析器根据某个 schema来验证此XML文档-->

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

<!—以下可替换为xsi:noNamespaceSchemaLocation="shiporder.xsd",与XML处于相同的文件夹-->

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

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

6) 对DTD的引用(见XML基础篇)

4. XSD - <schema> 元素

<schema> 元素是每一个 XMLSchema 的根元素。


1) <schema> 元素

<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:

<?xml version="1.0"?>

<!--schema中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"-->

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

<!--被此schema定义的元素(note, to, from, heading, body)来自命名空间:"http://www.w3school.com.cn"-->

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

<!--默认的命名空间-->

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

<!--指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定-->

elementFormDefault="qualified">

...

...

</xs:schema>

2) 在 XML 文档中引用 Schema

此 XML 文档含有对 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.cn note.xsd">

<to>Andy</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

默认命名空间的声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。

1.1.2. 简单的类型

1. XSD 简易元素

1) XML Schema 可定义 XML 文件的元素。

简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。

2) 定义简易元素

定义简易元素的语法:

<xs:element name="xxx" type="yyy"/>

此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型,最常用的类型是:

xs:string

xs:decimal

xs:integer

xs:boolean

xs:date

xs:time

3) 例子:

这是一些 XML 元素:

<lastname>Smith</lastname>

<age>28</age>

<dateborn>1980-03-27</dateborn>

这是相应的简易元素定义:

<xs:element name="lastname" type="xs:string"/>

<xs:element name="age" type="xs:integer"/>

<xs:element name="dateborn" type="xs:date"/>

4) 简易元素的默认值和固定值

简易元素可拥有指定的默认值或固定值。当没有其他的值被规定时,默认值就会自动分配给元素。下面的例子中,缺省值是 "red":

<xs:element name="color" type="xs:string"default="red"/>

固定值同样会自动分配给元素,并且您无法规定另外一个值。

在下面的例子中,固定值是 "red":

<xs:element name="color"type="xs:string" fixed="red"/>

2. XSD 属性

所有的属性均作为简易类型来声明。简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

1) 声明属性

定义属性的语法是:

<xs:attribute name="xxx" type="yyy"/>

xxx 指属性名称,yyy 则规定属性的数据类型。

2) 实例

这是带有属性的 XML 元素:

<lastname lang="EN">Smith</lastname>

这是对应的属性定义:

<xs:attribute name="lang" type="xs:string"/>

3) 属性也有默认值和固定值的定义

4) 可选的和必需的属性

在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:

<xs:attribute name="lang" type="xs:string"use="required"/>

3. XSD 限定 / Facets

限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为facet。


1) 对值的限定

下面的例子定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于100:

<xs:element name="age">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:minInclusive value="0"/>

<xs:maxInclusive value="100"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

2) 对一组值的限定

如需把 XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。下面的例子定义了带有一个限定的名为 "car" 的元素。可接受的值只有:Audi, Golf, BMW:

<xs:element name="car">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:enumeration value="Audi"/>

<xs:enumeration value="Golf"/>

<xs:enumeration value="BMW"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

上面的例子也可以被写为:

<xs:element name="car" type="carType"/>

<xs:simpleType name="carType">

<xs:restriction base="xs:string">

<xs:enumeration value="Audi"/>

<xs:enumeration value="Golf"/>

<xs:enumeration value="BMW"/>

</xs:restriction>

</xs:simpleType>

注释:在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。

3) 对一系列值的限定

如需把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。

下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值只有小写字母 a - z 其中的一个:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

又如:

<xs:pattern value="[A-Z][A-Z][A-Z]"/>:可接受的值是大写字母 A- Z 其中的三个。

<xs:pattern value="([a-z])*"/>:可接受的值是 a - z中零个或多个字母。

<xs:pattern value="male|female"/>:可接受的值是 male 或者 female。

<xs:pattern value="[a-zA-Z0-9]{8}"/>:可接受的值是由 8 个字符组成的一行字符。

4) 对空白字符的限定

如需规定对空白字符(whitespace characters)的处理方式,我们需要使用whiteSpace 限定。下面的例子定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符:

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="preserve"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

如果这个 whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符):

<xs:whiteSpace value="replace"/>。

如果这个 whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):

<xs:whiteSpace value="collapse"/>

5) 对长度的限定

如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。

<xs:length value="8"/>

<xs:minLength value="5"/>

<xs:maxLength value="8"/>

6) 数据类型的限定

限定
描述
enumeration
定义可接受值的一个列表
fractionDigits
定义所允许的最大的小数位数。必须大于等于0。
length
定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive
定义数值的上限。所允许的值必须小于此值。
maxInclusive
定义数值的上限。所允许的值必须小于或等于此值。
maxLength
定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive
定义数值的下限。所允许的值必需大于此值。
minInclusive
定义数值的下限。所允许的值必需大于或等于此值。
minLength
定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern
定义可接受的字符的精确序列。
totalDigits
定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace
定义空白字符(换行、回车、空格以及制表符)的处理方式。

1.1.3. 复杂的类型

XSD 复合元素包含了其他的元素及/或属性。

1. XSD复合元素

1) 定义复合元素

这个复合 XML 元素,"employee",仅包含其他元素:

<employee>

<firstname>John</firstname>

<lastname>Smith</lastname>

</employee>

在 XML Schema 中,我们有两种方式来定义复合元素:

a) 通过命名此元素,可直接对"employee"元素进行声明,就像这样:

<xs:element name="employee">

<xs:complexType>

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

被包围在指示器 <sequence>中意味着子元素必须以它们被声明的次序出现。

b) "employee" 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称:

<xs:element name="employee" type="personinfo"/>

<xs:element name="student" type="personinfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

如果使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型。

也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,比如这样:

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

<xs:complexType name="fullpersoninfo">

<xs:complexContent>

<xs:extension base="personinfo">

<xs:sequence>

<xs:element name="address" type="xs:string"/>

<xs:element name="city" type="xs:string"/>

<xs:element name="country" type="xs:string"/>

</xs:sequence>

</xs:extension>

</xs:complexContent>

</xs:complexType>

2) XSD 复合空元素

空的复合元素不能包含内容,只能含有属性。

<xs:element name="product" type="prodtype"/>

<xs:complexType name="prodtype">

<xs:attribute name="prodid" type="xs:positiveInteger"/>

</xs:complexType>

3) XSD 仅含文本复合元素

仅含文本的复合元素可包含文本和属性。使用 extension 或 restriction 元素来扩展或限制元素的基本简易类型。

<shoesize country="france">35</shoesize>

<xs:element name="shoesize" type="shoetype"/>

<xs:complexType name="shoetype">

<xs:simpleContent>

<xs:extension base="xs:integer">

<xs:attribute name="country" type="xs:string" />

</xs:extension>

</xs:simpleContent>

</xs:complexType>

4) XSD 带有混合内容的复合类型

混合的复合类型可包含属性、元素以及文本。

XML 元素,"letter",含有文本以及其他元素:

<letter>

Dear Mr.<name>John Smith</name>.

Your order <orderid>1032</orderid>

will be shipped on <shipdate>2001-07-13</shipdate>.

</letter>

下面这个 schema 声明了这个 "letter" 元素:

<xs:element name="letter" type="lettertype"/>

<xs:complexType name="lettertype" mixed="true">

<xs:sequence>

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

<xs:element name="orderid" type="xs:positiveInteger"/>

<xs:element name="shipdate" type="xs:date"/>

</xs:sequence>

</xs:complexType>

2. XSD 复合类型指示器

通过指示器,我们可以控制在文档中使用元素的方式。有七种指示器:

Order 指示器:

All

Choice

Sequence

Occurrence指示器:

maxOccurs

minOccurs

Group 指示器:

Group name

attributeGroup name

1) Order 指示器

Order 指示器用于定义元素的顺序。

a) All 指示器

规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:

<xs:element name="person">

<xs:complexType>

<xs:all>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:all>

</xs:complexType>

</xs:element>

注释:当使用 <all> 指示器时,你可以把 <minOccurs> 设置为 0 或者 1,而只能把 <maxOccurs> 指示器设置为 1。

b) Choice 指示器

规定可出现某个子元素或者可出现另外一个子元素(非此即彼):

<xs:element name="person">

<xs:complexType>

<xs:choice>

<xs:element name="employee" type="employee"/>

<xs:element name="member" type="member"/>

</xs:choice>

</xs:complexType>

</xs:element>

如需设置子元素出现任意次数,可将 <maxOccurs> (稍后会讲解)设置为 unbounded(无限次)。

c) Sequence 指示器

规定子元素必须按照特定的顺序出现。

2) Occurrence 指示器

用于定义某个元素出现的频率。

注释:对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。

a) maxOccurs 指示器

<maxOccurs> 指示器可规定某个元素可出现的最大次数:

<xs:element name="person">

<xs:complexType>

<xs:sequence>

<xs:element name="full_name" type="xs:string"/>

<xs:element name="child_name" type="xs:string" maxOccurs="10"/>

</xs:sequence>

</xs:complexType>

</xs:element>

上面的例子表明,子元素 "child_name" 可在 "person"元素中最少出现一次(其中 minOccurs 的默认值是 1),最多出现 10 次。

b) minOccurs 指示器

指示器可规定某个元素能够出现的最小次数。

<xs:element

name="child_name" type="xs:string" maxOccurs="10"minOccurs="0"/>

提示:如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明:

3) Group 指示器

用于定义相关的数批元素。

a) 元素组

元素组通过 group 声明进行定义,必须在 group 声明内部定义一个 all、choice 或者 sequence 元素。下面这个例子定义了名为 "persongroup" 的 group,它定义了必须按照精确的顺序出现的一组元素:

<xs:group name="persongroup">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

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

</xs:sequence>

</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:group ref="persongroup"/>

<xs:element name="country" type="xs:string"/>

</xs:sequence>

</xs:complexType>

b) 属性组

属性组通过 attributeGroup 声明来进行定义

<xs:attributeGroup name="personattrgroup">

<xs:attribute name="firstname" type="xs:string"/>

<xs:attribute name="lastname" type="xs:string"/>

<xs:attribute name="birthday" type="xs:date"/>

</xs:attributeGroup>

<xs:element name="person">

<xs:complexType>

<xs:attributeGroup ref="personattrgroup"/>

</xs:complexType>

</xs:element>

3. XSD 元素替换——国际化

通过 XML Schema,一个元素可对另一个元素进行替换。可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,那么您就不必规定可替换元素的类型了。

让我们举例说明:我们的用户来自英国和挪威。我们希望有能力让用户选择在 XML 文档中使用挪威语的元素名称还是英语的元素名称。为了解决这个问题,我们可以在 XML schema 中定义一个substitutionGroup。首先,我们声明主元素,然后我们会声明次元素,这些次元素可声明它们能够替换主元素。

<xs:elementname="name" type="xs:string"/>

<xs:elementname="navn" substitutionGroup="name"/>

在上面的例子中,"name"元素是主元素,而 "navn" 元素可替代 "name" 元素。

请看一个 XML schema 的片段:

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

<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">

<xs:sequence>

<xs:element ref="name"/>

</xs:sequence>

</xs:complexType>

<xs:element name="customer" type="custinfo"/>

<xs:element name="kunde" substitutionGroup="customer"/>

有效的 XML 文档类似这样(根据上面的schema):

<customer>

<name>John Smith</name>

</customer>

或类似这样:

<kunde>

<navn>John Smith</navn>

</kunde>

1.1.4. 数据类型

1. XSD 字符串数据类型

<xs:elementname="customer" type="xs:string"/>

规格化字符串数据类型同样可包含字符,但是 XML 处理器会移除折行,回车以及制表符:

<xs:element name="customer" type="xs:normalizedString"/>

在上面的例子中,XML 处理器会使用空格替换所有的制表符。

Token 数据类型同样源自于字符串数据类型。Token 数据类型同样可包含字符,但是 XML 处理器会移除换行符、回车、制表符、开头和结尾的空格以及(连续的)空格。

除了以上两种外还有很多种字符串数据类型。

2. XSD 日期及时间数据类型

日期使用此格式进行定义:"YYYY-MM-DD",时间使用下面的格式来定义:"hh:mm:ss",日期时间使用下面的格式进行定义:"YYYY-MM-DDThh:mm:ss",所有的成分都是必需的。

<xs:element name="startdate"type="xs:date"/>

<xs:element name="startdate"type="xs:dateTime"/>

3. XSD 数值数据类型

十进制数据类型用于数值。可规定的十进制数字的最大位数是 18 位。

<xs:element name="prize"type="xs:decimal"/>

<prize>-999.5230</prize>

整数数据类型用于规定无小数成分的数值。

<xs:element name="prize"type="xs:integer"/>

数值数据类型:(下面所有的数据类型均源自于十进制数据类型(除 decimal 本身以外))

名字
秒数
byte
有正负的 8 位整数
decimal
十进制数
int
有正负的 32 位整数
integer
整数值
long
有正负的 64 位整数
negativeInteger
仅包含负值的整数 ( .., -2, -1.)
nonNegativeInteger
仅包含非负值的整数 (0, 1, 2, ..)
nonPositiveInteger
仅包含非正值的整数 (.., -2, -1, 0)
positiveInteger
仅包含正值的整数 (1, 2, ..)
short
有正负的 16 位整数
unsignedLong
无正负的 64 位整数
unsignedInt
无正负的 32 位整数
unsignedShort
无正负的 16 位整数
unsignedByte
无正负的 8 位整数
4. XSD 杂项数据类型

其他杂项数据类型包括boolean、base64Binary、十六进制、浮点、双精度、anyURI、anyURI 以及 NOTATION。

<xs:attribute name="disabled"type="xs:boolean"/>

合法的布尔值是 true、false、1(表示 true)以及0(表示 false)。

二进制数据类型用于表达二进制形式的数据。

两种二进制数据类型:

l base64Binary (Base64 编码的二进制数据)

l hexBinary (十六进制编码的二进制数据)

<xs:elementname="blobsrc" type="xs:hexBinary"/>

anyURI 数据类型用于规定 URI。

下面是一个关于某个 scheme 中 anyURI 声明的例子:

<xs:attributename="src" type="xs:anyURI"/>

文档中的元素看上去应该类似这样:

<picsrc="http://www.w3school.com.cn/images/smiley.gif" />

注释:假如某个 URI含有空格,用 %20替换它们。

5. XML Schema 参考手册

XSD 元素

元素

解释

all

规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。

annotation

annotation 元素是一个顶层元素,规定 schema 的注释。

any

使创作者可以通过未被 schema 规定的元素来扩展 XML 文档。

anyAttribute

使创作者可以通过未被 schema 规定的属性来扩展 XML 文档。

appInfo

规定 annotation 元素中应用程序要使用的信息。

attribute

定义一个属性。

attributeGroup

定义在复杂类型定义中使用的属性组。

choice

仅允许在 <choice> 声明中包含一个元素出现在包含元素中。

complexContent

定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。

complexType

定义复杂类型。

documentation

定义 schema 中的文本注释。

element

定义元素。

extension

扩展已有的 simpleType 或 complexType 元素。

field

规定 XPath 表达式,该表达式规定用于定义标识约束的值。

group

定义在复杂类型定义中使用的元素组。

import

向一个文档添加带有不同目标命名空间的多个 schema。

include

向一个文档添加带有相同目标命名空间的多个 schema。

key

指定属性或元素值(或一组值)必须是指定范围内的键。

keyref

规定属性或元素值(或一组值)对应指定的 key 或 unique 元素的值。

list

把简单类型定义为指定数据类型的值的一个列表。

notation

描述 XML 文档中非 XML 数据的格式。

redefine

重新定义从外部架构文件中获取的简单和复杂类型、组和属性组。

restriction

定义对 simpleType、simpleContent 或 complexContent 的约束。

schema

定义 schema 的根元素。

selector

指定 XPath 表达式,该表达式为标识约束选择一组元素。

sequence

要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数。

simpleContent

包含对 complexType 元素的扩展或限制且不包含任何元素。

simpleType

定义一个简单类型,规定约束以及关于属性或仅含文本的元素的值的信息。

union

定义多个 simpleType 定义的集合。

unique

指定属性或元素值(或者属性或元素值的组合)在指定范围内必须是唯一的。

XSD 限定 / Facets

限定
描述
enumeration
定义可接受值的一个列表
fractionDigits
定义所允许的最大的小数位数。必须大于等于0。
length
定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive
定义数值的上限。所允许的值必须小于此值。
maxInclusive
定义数值的上限。所允许的值必须小于或等于此值。
maxLength
定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive
定义数值的下限。所允许的值必需大于此值。
minInclusive
定义数值的下限。所允许的值必需大于或等于此值。
minLength
定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern
定义可接受的字符的精确序列。
totalDigits
定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace
定义空白字符(换行、回车、空格以及制表符)的处理方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐