XML
XML的学习目标:
1)能用XML描述现实中的有层次关系的数据
2)能使用程序读取到XML中表示的数据
一、XML是什么?作用是什么?
1.XML是指可扩展标记语言,用户自定义的标签,是相对于HTML来讲的(标签预定义的)。
2.XML被设计的宗旨是表示数据(传输和存储数据)。HTML是用来显示数据的。目前经常使用的XML版本是1.0。
3.XML除了表示数据外。在实际的企业开发中,主要用XML作为程序的配置文件。
(在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码。
4.XML是一种通用的数据交换格式。
二、XML文档的组成
一个XML文件一般由以下几个部分组成:
1.文档声明
作用:用于标识该文档是一个XML文档
注:声明必须出现在文档的第一行(之前连空行都不能有,也不能有任何的注释)
最简单的XML声明:<?xml version="1.0"?>
声明中的encoding属性:说明解析当前XML文档时所使用的编码。默认是UTF-8
<?xml version="1.0" encoding="GB2312"?>
声明中的standalone属性:说明XML文档是否是独立的。
<?xml version="1.0" standalone="yes"?>
2.元素
XML元素指XML文件中出现的标签。
一个标签分为起始和结束标签。结束标签不能省略。
eg:包含标签体<mytag>apple</mytag>
不包含标签体<mytag/>
一个XML文档必须且只能有一个根标签,其他标签都是这个根标签的子标签或孙标签。
XML文档中不会忽略回车和换行及空格(注:在XML文档中不使用回车换行等,可提高在网络上传输效率)
标签的命名规范:元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点。严格区分大小写。
3.元素的属性
一个元素可以有多个属性,每个属性都有它自己的名称和取值。
元素的属性取值一定要用引号引起来(单引号或双引号)
在XML中,标签属性所代表的信息也可以被改成用子元素的形式来描述。
4.注释
<!--这是注释-->
注释不能嵌套
5.CDATA区
作用:把CDATA中的内容都当做是文本。
语法:
<![CDATA[
文本内容
]]>
例如:
<![CDATA[
<福建>
<厦门></厦门>
<福州></福州>
</福建>
]]>
6.特殊字符
& --> &
< --> <
> --> >
" --> "
' --> '
7.处理指令(PI)
作用:用来指挥软件如何解析XML文档。
语法:必须以"<?"作为开头,以"?>"作为结尾。
eg:
<?xml version="1.0"?>
eg:
demo.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/css" href="s.css"?> <size> <big>大</big> <medium>中</medium> <small>小</small> </size> s.css big{ font-size:400px; color:red; } medium{ font-size:100px; color:blue; } small{ font-size:40px; color:green; }
三、XML约束
XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
1.格式良好的XML文档:符合XML语法的。
2.有效的XML文档:遵循约束规范的。
格式良好的不一定是有效的,有效的必定格式良好。
四、DTD的基本语法
DTD:文档类型定义
作用:约束XML的书写规范。
DTD文件保存到磁盘时,必须使用UTF-8编码
1.引入外部的DTD文档来约束当前的XML文档
DTD文件在本地:<!DOCTYPE 根元素名称 SYSYTEM "DTD文件的路径">
DTDT文件在网络上:<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD的路径URL">
2.定义元素
语法:<!ELEMENT 元素名称 使用规则>
使用规则:
(#PCDATA):指示元素的主体内容只能是普通的文本。
EMPTY:指示元素不能有主体内容。
ANY:用于指示元素的主体内容为任意类型
(子元素):指示元素中包含的子元素
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档
如果子元素用“|”分开,说明任选其一
用+、*、?来表示元素出现的次数
如果元素后面没有+、*、?表示必须且只能出现一次
+:表示至少出现一次,一次或多处
*:表示可有可无,零次、一次或多处
?:表示可有可无,有的话只能有一次。
3.定义属性
语法:<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明>
属性值类型:
CDATA:说明该属性的取值为一个普通文本
ENUMERATED (DTD没有此关键字)
语法:<!ATTLIST 元素名称 (值1|值2) "值1">
ID:属性的取值不能重复
设置说明:
#REQUIRED:表示该属性必须出现
#IMPLIED:表示可有可无
#FIXED:表示属性的取值为一个固定值
语法:#FIXED "固定值"
直接值:表示属性的取值为该默认值
4.定义实体(ENTITY)
实体的定义分为引用实体和参数实体
引用实体:
作用:在DTD中定义,在XML中使用
语法:<!ENTITY 实体名称 "实体内容">
在XML中使用:&实体名称;
参数实体:
作用:在DTD中定义,在DTD中使用
语法:<!ENTITY % 实体名称 "实体内容">
在DTD中使用:%实体名称;
eg:
instance.dtd
<!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)> <!ELEMENT HOLIDAY (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)> <!ELEMENT TIME (#PCDATA)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED> <!ATTLIST CHANNEL CHAN CDATA #REQUIRED> <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED> <!ATTLIST TITLE RATING CDATA #IMPLIED> <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
instance.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE TVSCHEDULE SYSTEM "instance.dtd"> <TVSCHEDULE NAME="XXTV"> <CHANNEL CHAN="YY"> <BANNER>AAA</BANNER> <DAY> <DATE>2013-04-13</DATE> <PROGRAMSLOT> <TIME>14:57</TIME> <TITLE LANGUAGE="ZH">TT</TITLE> <DESCRIPTION>DD</DESCRIPTION> </PROGRAMSLOT> </DAY> </CHANNEL> </TVSCHEDULE>
五、Schema
1.Schema简介
1)XML Schema是一种用于定义和描述XML文档结构与内容的模式语言。
2)XML Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd。
3)一个XML Schema文档通常称为模式文档(约束文档),遵循这个文档书写的XML文件称为实例文档
2.快速入门案例
根据book.xsd编写book.xml
book.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.lsl.cn" elementFormDefault="qualified"> <xs:element name='书架' > <xs:complexType> <xs:sequence maxOccurs='unbounded' > <xs:element name='书' > <xs:complexType> <xs:sequence> <xs:element name='书名' type='xs:string' /> <xs:element name='作者' type='xs:string' /> <xs:element name='售价' type='xs:string' /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
book.xml
<?xml version="1.0" encoding="UTF-8"?> <lsl:书架 xmlns:lsl="http://www.lsl.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lsl.cn book.xsd"> <lsl:书> <lsl:书名>JavaSE</lsl:书名> <lsl:作者>张三</lsl:作者> <lsl:售价>80.0</lsl:售价> </lsl:书> </lsl:书架>
分析:(根据xsd约束文档编写xml的步骤)
a、首先看Schema文档,找到根元素
<?xml version="1.0" encoding="UTF-8"?> <书架></书架>
b、思考:书架来自于哪个名称空间?看Schema文档,targetNamespace就是名称空间。
用xmlns关键字(xmlns名称空间声明)来声明我的元素来自哪个名称空间(xmlns:xml namespace)
<?xml version="1.0" encoding="UTF-8"?> <lsl:书架 xmlns:lsl="http://www.lsl.cn"></lsl:书架>
c、思考:名称空间与哪个xsd文件对应呢?使用schemaLocation关键字来关联名称空间和xsd的对应关系
<?xml version="1.0" encoding="UTF-8"?> <lsl:书架 xmlns:lsl="http://www.itcast.cn" schemaLocation="http://www.lsl.cn book.xsd"></lsl:书架>
d、schemaLocation来自哪里?来自一个标准的名称空间
(http://www.w3.org/2001/XMLSchema-instance)
<?xml version="1.0" encoding="UTF-8"?> <lsl:书架 xmlns:lsl="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lsl.cn book.xsd"> </lsl:书架>
3.引用两个Schema文件
company.xsd
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/company" elementFormDefault="qualified"> <element name="company"> <complexType> <sequence> <element name="employee"> <complexType> <sequence> <any></any> <element name="name"></element> </sequence> <attribute name="age" type="int"></attribute> </complexType> </element> </sequence> </complexType> </element> </schema>
department.xsd
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/department" elementFormDefault="qualified"> <element name="name" type="string"></element> </schema>
company.xml
<?xml version="1.0" encoding="UTF-8"?> <company xmlns="http://www.example.org/company" xmlns:dept="http://www.example.org/department" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd" > <employee age="20"> <dept:name>人力资源部</dept:name> <name>小刘</name> </employee> </company>