概述
-
XML(eXtensive Markup Language)可扩展的标记语言,是万维网联盟(World Wide Web Consortium W3C)定义的一种标准。 可扩展性指允许用户按照XML规则自定义标记(tags 标签)。
-
作用:
- 作为微型数据库,存储数据;
- 作为通信数据;
- 用于不同平台,不用系统交换数据;
- 作为配置文件,为应用程序配置数据;
- 结合样式表语言,展示数据。
-
强项:轻松表达多层结构的数据;可扩展。
优点:平台无关,语言无关。设计目标是描述数据并集中于数据的内容,与显示分离。
提醒:不能用XML来直接写网页。即便是包含了XML数据,依然要转换成HTML格式才能在浏览器上显示。 -
xml特征 :纯文本 、严格的格式、可扩展(标记可扩展)。
语法
XML文档主要由如下部分组成: XML声明–处理指令(Processing Instruction) 、元素、属性、实体、注释。
声明(指令)
大多数XML文档以XML声明作为开始,它向解析器提供了关于文档的基本信息。建议使用XML声明,但它不是必需的。如果有的话,那么它一定是文档的第一行内容。例如:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
声明最多可以包含三个名称-值对(许多人称它们为属性,尽管在技术上它们并不是)。
-
问号与xml之间不能有空格;
-
version 是使用的XML 版本:1.0, 1.1 ;
-
encoding 是该文档所使用的字符集。该声明中引用的ISO-8859-1 字符集包括大多数西欧语言用到的所有字符。默认字符在UTF-8字符集中,这是一个几乎支持世界上所有语言的字符和象形文字的Unicode 标准;
-
standalone(可以是yes 或no)定义了是否孤立处理该文档。如果XML文档没有引用任何其它文件,则可以指定 standalone=”yes”。如果XML文档引用其它描述该文档可以包含什么的文件(如DTD),则 standalone=”no”。默认值为”no”。
注释
- 注释可以出现在文档的任何位置。(但不建议放在声明前面,部分浏览器会报错) ;
- 注释以 结束;
- 注释内不能包含双连字符(–);除此之外,注释可以包含任何内容;
- 注释不能写在第一行,标签或注释内;
- 注释内的任何标记都被忽略。
标记(标签)
<标记名>内容<’/标记名>:左尖括号“<“和右尖括号“>“之间的文本:
- 在< >中的称为开始标记;在<’/ >中的称为结束标记;
- 空标记:不包含元素内容的标记。空标签必须以“/>”结束。格式: <空标记的名称/>,<空标记的名称 属性列表/>。
注意:
- 除空标记外,标签必须成对:有始有终。所有的开始标签和结束标签必须匹配;
- 在标记符“<“和”标记的名称”之间不能含有空格。在标记符”/>”前面可以有空格或回行;
- XML的标记是区分大小写的,开始标记与结束标记名称必须严格完全相同。
XML标记必须遵循下面的命名规则:
- 名字中可以包含字母、数字以及其它字母或文字;还可包含下划线(_)、点(.)、连字符(-);
- 名字不能以数字开头;可以用字母、文字或者下划线开头;
- 名字不能以字母xml (或XML 或Xml ..) 开头;
- 名字中不能包含空格。
元素
- 位于开始标记与结束标记间;
- 一份文档有且只有一个根元素;
- 根元素下的所有元素叫“子元素”;
- 不包含子元素的元素叫“叶子”;包含子元素的元素叫“分支”。
属性
属性是标记的属性,可以为标记添加附加信息。属性是一个名值对,必须由名称和值组成,属性必须在标记的开始标记或空标记中声明,用”=”为属性指定一个值。 语法如下:
<标记名称 属性列表/>
<标记名称 属性列表>XXX</标记名称>
<!-- 例如 -->
<桌子 width="40" height='100'/>
所有的属性值必须位于单引号或双引号中。每个标记内可以出现多组属性,但是不能出现同名属性。开始标志内,类似赋值语句,例如:
<eric age="80" sex="man">……</eric>
使用属性的原则:
属性不体现数据的结构,只是数据的附加信息; 一个信息是作为一个标记的属性或子标记,取决于具体问题,不要因为属性的频繁使用破坏XML的数据结构。下面是一个结构清晰的XML文件:
<楼房 height="23m" width="12m">
<结构>混凝土</结构>
<类别>商用</类别>
</楼房>
下面是一个结构不清晰的XML文件:
<楼房 height="23m" width="12m" 结构="混凝土" 建筑商="华海集团" 类别="商用"></楼房>
处理指令
- 大多数XML 文档都是以XML 声明开始,该声明本身就是特殊的处理指令;
- 处理指令对应用程序特定的数据进行编码;
- 一条处理指令包含一个目标,后跟数据。用<’?和?>定界符将处理指令包起来;
- 目标确定应用程序,而对应用程序不能识别的目标,其会忽略这些处理指令。
实体
XML 规范预定义了五个实体。
< ==== <
> ==== >
" ==== ”
' ==== ‘
& ==== &
自定义实体:在DTD中定义 <’!ENTITY 实体标志 “实体内容”> ,在xml中引用自定义实体,用 &实体标志; 代表实体内容。另外,无法从键盘输入的字符可以使用字符引用,就是用字符的Unicode代码点来引用该字符。以”&#x”开始字符引用,以分号结尾,x必须为小写,使用十六进制。如: =’; 表示等于号。
也可以使用字符引用来引用 <,>,’,”,& ” 查看字符的代码点(附件-> 系统工具-> 字符映射表)。
CDATA
当一段文本中出现很多实体引用和字符引用时,会导致文本数据的读写困难,CDATA段就是为了解决这一问题引入的。 DATA区段开始于 “<.![CDATA[” 结束于 “]]>” 。CDATA内部的所有东西都会被解析器忽略解析,不用检查它的格式。例如:
<superType 范围="200" 程度="100%">
<![CDATA[<"溅射"伤害>]]>
</superType>
解析后内容:<”溅射”伤害> ,但是CDATA段中不能嵌套另一个CDATA段。
名称空间/包
XML文件允许自定义标记,所以可能出现同名字的标记,为了区分这些标记,就需要使用名称空间。名称空间的目的是有效的区分相同的标记,其实并不真实存在。
语法:使用属性 xmlns 来定义命名空间。
声明有前缀的名称空间 xmlns:前缀名=名称空间的名字 ;
声明无前缀的名称空间 xmlns=名称空间的名字 (缺省);
注意:当且仅当它们的名字相同时称二个名称空间相同,也就是说,对于有前缀的名称空间,如果二个名称空间的名字相同,即使前缀不相同,也是相同的名称空间,返之同然。前缀只是方便引用而已。
格式
- 序言Prolog:包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration)。
- 格式良好:符合基本格式,即良构(well-formed 规范的),符合W3C定义的XML文档。
- 有效文档:符合可扩展,支持额外格式.能通过验证(如:DTD,Schema等)的文档。
为什么需要验证?对XML文件施加额外的约束,以便交流。 规范的XML文件不一定是有效的;有效的一定是规范的。 构成格式良好的基本规则:
- 第一条指令(声明)必须顶头写,前面不能有任何空格等 ;
- 标记必须成对;
- 最外围的元素(根元素)只能有一个;
- 属性只能出现在开始标记内;
- 属性必须有值;
- 属性值必须加引号(单引号、双引号都可以) ;
- 元素可以嵌套,但是不能交叉;
- 空元素可以简写,例:<.A><./A> 简写后:<.A/>;
- 大小写敏感。
DTD验证
- 文档类型定义(Document Type Definition) ;
- DTD定义了XML文档内容的结构,保证XML以一致的格式存储数据;
- 精确的定义词汇表,对XML的内容施加约束;
- 符合DTD的规范XML文档称为有效的文档;由DTD定义的词汇表以及文档语法,XML解析器可以检查XML文档内容的有效性;
- 不同的组织,可一致地使用相同标准的 DTD 来交换数据;
- 应用程序也可使用定义的 DTD 来验证从外部接收到的数据;
- 使用 DTD 来验证自身数据的有效性。
DTD声明
- DTD声明可以在单独的一个文件中;
- DTD声明可以内嵌在XML文件中;
- DTD声明可以一部分在单独的文件中,另一部分内嵌在XML文件中。
引入外部DTD文件
<!DOCTYPE root SYSTEM "DTDName.dtd">
root:根节点名称;
DTDName.dtd:dtd文件的路径与名字,相同文件夹下可以省略路径,只用名字。
DTD四种标记声明
元素(ELEMENT)、属性(ATTLIST)、实体(ENTITY)、符号(NOTATION)。
(1)元素(ELEMENT):XML元素类型声明
声明元素:
<!ELEMENT 元素名 (内容模式)>
元素的内容通过内容模式来描述。
DTD 内容模式的种类有:
- EMPTY:元素不能包含任何数据,但可以有属性(前提是必须声明其属性);不能有子元素,不能有文本数据(包括空白,换行符);DTD中定义:
<!ELEMENT elementName EMPTY>
XML中:
<elementName/>(推荐)
或者:
<elementName></elementName>
- (#PCDATA):规定元素只包含已析的字符数据,而不包含任何类型的子元素的内容类型;DTD中定义:
<!ELEMENT student (#PCDATA)>
XML中合法内容:
<student>watching TV</student>
- (Elements):元素由内容模式部件指定。
<!ELEMENT name (child particles) >
内容模式部件可以是下表列出的内容:
<!ELEMENT name (a,b)> 子元素a、b必须出现,且按照列表的顺序
<!ELEMENT name (a|b)> 选择;子元素a、b只能出现一个
<!ELEMENT name (a) > 子元素a只能且必须出现一次
<!ELEMENT name (a)+ > 子元素a出现一次或多次
<!ELEMENT name (a)* > 子元素a出现任意次(包括零次、一次及多次)
<!ELEMENT name (a)? > 子元素a出现一次或不出现
- Mixed 混合模式:子元素中既可有文本数据又可有下级子元素。
<!ELEMENT rn (#PCDATA| an | en)*>
“|”和“”必须写。上句表示在 rn 内,字符数据或en及an,可以出现任意多次,顺序不限。优先写(#PCDATA) 如:(#PCDATA|name) 正确 ,(name|#PCDATA)* 错误。
- ANY:元素可以包含任何类型的数据。子元素(必须在DTD中有定义)和文本数据(包括空白)。DTD中定义:
<!ELEMENT a ANY> <!ELEMENT b ANY>
XML中合法内容:
<a>somngthing</a>
或者
<a/>
或者
<a><b>oo</b></a>
(2)属性(ATTLIST):特定元素类型可设置的属性&属性的允许值声明
<!ATTLIST elementName
attributeName1 attributeType attributeDefault
.......
attributeNameN attributeType attributeDefault>
属性类型 (Attribute Type):
- CDATA :该属性只能包含字符数据(注意与CDATA段、PCDATA的区别) ;
- NMTOKEN :是CDATA的子集,它的字符只能是字母,数字,句点,破折号,下划线或冒号;
- NMTOKENS :类似NMTOKEN,但这个可以包含多个值,每个值之间用空格隔开;
- ID : 该属性的取值在同一文档内是唯一的。一个元素只能有一个ID类型的属性;
- IDREF :类似指针,指向文档中其他地方声明的ID值。如果该属性取值和指向的ID值不匹配,则返回错误。
- IDREFS :类似IDREF,但它可以具有由空格分隔开的多个引用;
- ENTITY: 该属性的值必须对应一个在文档内部声明的但还没有分析过的实体;
- ENTITYS:类似ENTITY,但它可以包含由空格分隔开的多个实体;
- NOTATION :该属性的值必须引用在文档中其他地方声明的某个注释的名称;
- (enumerated) :类似枚举的变量,该属性必须匹配所列的值。各值用“|”分隔开。 如: (春|夏|秋|冬) 实际内容文档只能从中取一个。
属性特性 (Attribute Default) :
- #REQUIRED 必须有且只能有一个属性;
- #IMPLIED 可有可无;
- #FIXED 在DTD中定义默认值,XML中可以不指定,指定则必须等于该默认值;
- attribute-value 如果不指定则用DTD定义的默认值,指定则用指定的值。
属性(ATTLIST)的举例:
例一(#REQUIRED)
DTD中:
<!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED at2 CDATA #REQUIRED>
XML中:
正确: <el at1 = "10 20" at2="10" >something</el>
错误: <el at="10">something</el> (没有写另一个#REQUIRED的属性 at2 )
例二(#IMPLIED,#FIXED)
DTD中:
<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10" at2 CDATA #IMPLIED >
XML中:
正确: <el at2="20" >something</el> (at有默认值"10",at2 可写可不写)
错误: <el at="11" >something</el>(at要么不写,要写只能写成跟默认值相同的)
例三(attribute-value)
DTD中:
<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >
XML中:
正确: <el at="11" >something</el>
例四(enumerated + attribute-value)
DTD中:
<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">
XML中:
正确: <el at="20">something</el> (at要么不写,默认值 10;要么在(10|20|30)中选一个写)
(3)实体(ENTITY):可重用的内容声明。
在DTD中定义
<!ENTITY 实体标志 "实体内容">
在xml中引用自定义的实体,用 &实体标志; 代表实体内容。
(4)符号(NOTATION) :不要解析的外部内容的格式声明。
内外部的实体举例
内部实体:在xml文件里面写(少用);
外部实体:另外在xml同一文件夹下建立一个dtd文件(提倡);
外部的:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用这句引用外部dtd-->
<root>
<goodsInfo>
<goodsName>goodsName</goodsName>
<goodsPrice>goodsPrice</goodsPrice>
</goodsInfo>
</root>
以下是名为”goodsInfo.dtd”文件
<!ELEMENT root (goodsInfo)>
<!ELEMENT goodsInfo (goodsName,goodsPrice)>
<!ELEMENT goodsName (#PCDATA)>
<!ELEMENT goodsPrice (#PCDATA)>
内部的:
<?xml version="1.0" encodint="utf-8"?>
<!DOCTYPE root [
<!ELEMENT root(student)>
<!ELEMENT student (#PCDATA)>
<!ENTITY CCTV "中央电视台">
]>
<!--把DTD文件写在体内-->
<root>
<student>
student watch &CCTV;<!--使用自定义实体 CCTV-->
</student>
</root>
XML Schema
XML Schema介绍
- XML Schema用来描述 XML 文档的结构 ,定义XML文档中合法的内容块 ;
- XML Schema优于DTD,是DTD的替代品;
- XML Schema文件以.xsd作为文件扩展名 ;
- XML Schema在2001年5月2日成为W3C标准;
- Schema本生也是特殊的XML;
xsd文档的作用:
- 定义可出现在文档中的元素;
- 定义可出现在文档中的属性;
- 定义哪个元素是子元素;
- 定义子元素的次序;
- 定义子元素的数目;
- 定义元素是否为空,或者是否可包含文本 ;
- 定义元素和属性的数据类型;
- 定义元素和属性的默认值以及固定值;
优点:
- XML Schema本身就是一个XML;
- XML Schema 支持数据类型;
- XML Schema 支持名称空间;
- XML Schema 约束能力更强大;
缺点:XML Schema比DTD更复杂,不能定义实体。
XML Schema文档结构
简单类型(元素,属性,Facet)、复杂类型元素、匿名类型、外置类型。
<xs:element name=“元素名” type=“元素类型"/>
Schema内置了很多类型,常用的类型有:
- xs:string 字符串;
- xs:decimal 浮点型;
- xs:integer 整型;
- xs:boolean 布尔型;
- xs:date 日期;
- xs:time 时间;
xs:是命名空间前缀,元素的默认值用属性default指定,例:
<xs:element name="color" type="xs:string" default="red"/>
元素的固定值用属性fixed指定,例:
<xs:element name="color" type="xs:string" fixed="red"/>
元素出现的次数用属性minOccurs、maxOccurs来表示,默认值为1,unbounded表示不限制次数,例:
<xs:element name="comment" type=“xs:string” minOccurs="0"/>
<xs:element name="item" type=“xs:string” minOccurs="99" maxOccurs="unbounded">
属性声明语法:
<xs:attribute name=“属性名” type=“属性类型"/>
属性声明通常会出现在元素声明中,Schema的内置类型同样对属性类型有效,属性的默认值用属性default指定;
<xs:attribute name=“gender" type="xs:string" default=“male"/>
属性的固定值用属性fixed指定:
<xs:attribute name=“gender" type="xs:string" fixed=“male"/>
属性必须或可选性用属性use指定:
<xs:attribute name=“gender" type="xs:string" use=“required"/>
use属性值的取值有: optional(默认值)(可有可没有), required(必须有), prohibited(禁止,很少用)。
Facet(刻面):对xml元素或属性的简单数据类型进一步约束
- 限制字符串的长度, 包括 (length、minLength、maxLength) ;
- 限制整数的大小范围,包括 (minInclusive, maxInclusive, minExclusive, maxExclusive) ;
- 限制元素内容的枚举取值(enumeration);
- 限制浮点型数值的位数(totalDigits, fractionDigits) ;
定义在下列元素中:
<xs:simpleType>
<xs:restriction>
(此处写Facet)
</xs:restriction>
</xs:simpleType>
复杂类型元素:包含其他元素和文本或属性的 XML 元素,语法:
使用元素 <xs:complexType/> 来定义
四种类型的复杂元素:只包含属性、只包含属性和子元素、只包含文本内容和属性、包含属性,子元素和文本内容。
只包含属性 :
<xs:element name='blank'>
<xs:complexType>
<xs:attribute name='base' type='xs:integer' use='optional' default='10'/>
</xs:complexType>
</xs:element>
只包含属性和子元素:
<xs:element name=‘customer'>
<xs:complexType>
<xs:sequence>
<xs:element name=‘favor’ type=‘xs:string’/>
</xs:sequence>
<xs:attribute name=‘age' type='xs:integer'/>
</xs:complexType>
</xs:element>
复杂类型元素包含的子元素出现的顺序
<sequence> --- 子元素必须以它们被声明的次序出现
<choice> --- 子元素是选择关系,只能出现其中一个
<all> --- 子元素可按任意次序出现
只包含文本内容和属性:
<xs:element name='quantity'>
<xs:complexType>
<xs:simpleContent>
<xs:extension base='xs:nonNegativeInteger'>
<xs:attribute name='backorderable‘ type='xs:boolean'/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
包含属性,子元素和文本内容:
<xs:element name="工作经历">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="year“ type="xs:date"/>
</xs:sequence>
<xs:attribute name=“title” type=“xs:string”use=“optional”/>
</xs:complexType>
</xs:element>
匿名类型定义:
<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>
外置类型定义:
<xs:element name="employee" type=“emptype”/>
<xs:complexType name=“emptype”> //必须定义在根元素中
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
XML Schema 验证
Schema文件:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema" //必须且固定(名字xs 可改变)
targetNamespace=" www.tarena.com.cn"
xmlns="http://www.tarena.com.cn"
elementFormDefault="qualified" />
-
XML Schema 文件的根元素一定是<.schema>;
-
xmlns:xs=”http://www.w3.org/2001/XMLSchema”:指明schema 中用到的元素和数据类型来自的命名空间为“http://www.w3.org/2001/XMLSchema” ,xs为自定义的前缀名。
-
targetNamespace=”http://www.tarena.com.cn”:目标命名空间。用于指明此 xsd文档 约束的xml文件中元素 (note, to, from, heading, body) 的命名空间;
-
xmlns=”http://www.tarena.com.cn”: XSD也是一个XML文档, schema文档中默认的命名空间是 “http:// www.tarena.com.cn ” ;
-
elementFormDefault=”qualified“:Schema中定义的元素在xml中使用时,必须被命名空间限定。
受约束的XML文件:
<?xml version="1.0"?>
<note xmlns="http://www.tarena.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.tarena.com.cn note.xsd" />
-
xmlns=”http://www.tarena.com.cn”:缺省命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的元素默认都被声明于 “http://www.tarena.com.cn” 这个命名空间。
-
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://www.tarena.com.cn note.xsd” /> :指定xsd的物理位置,前半部分是名称空间,后半部分参数是物理位置。使用的属性schemaLocation需要指定其所在的命名空间。