一、XML简介
1.eXtensible Makeup Language:可扩展标记性语言
XML和HTML一样都是标记性语言,使用标签来进行操作,但HTML里面的标签是固定的,XML的可扩展则是体现在可以自定义。
2.用途
HTML用于显示数据,XML也可以显示数据,但不是其主要功能,主要功能是存储数据。
有两个版本,1.0和1.1,但是我们用的是1.0。
3.XML的应用
不同的系统之间传输数据
用来表示生活中有关系的数据
经常用在配置文件
二、XML的语法
1.XML的文档声明
—创建一个文件,后缀名为.xml
—如果写XML,第一步,必须要有一个文档声明(证明这是一个XML文件)
<?xml version="1.0" encoding="gbk"?>
—文档声明必须是第一行第一列,前面不能有空格
—XML的编码有gbk和utf-8和iso8859-1(不包含中文)
—对于乱码,在保存时文件默认的格式和文档中定义的相同
2.定义元素(标签)
—标签定义有开始必须要有结束:<person></person>
—如果标签内没有内容,可以在标签内结束:<aa/>
—标签可以嵌套,但是必须合理嵌套
—一个xml中只能有一个根标签,其他的标签都嵌套在这里面
—在XML中会把空格和换行当初代码来解析,下面两个代码是不同的
<person>我是一个人</person>
<person>
我是一个人
</person>
—XML标签的命名规则:(1)、区分大小写 (2)不能以数字或者下划线开头 (3)不能以xml、XML等各种形式的开头 (4)标签 内不能包含空格和冒号
3.定义属性
—xml是标记性文档,也会有属性
—一个标签内可以有多个属性,但是属性的名字不能相同,即不能全部都写成
<person id="aa", id1="bb">我是一个人</person>
不能写为<person id="aa", id="bb">我是一个人</person>
—属性与属性值之间使用=,属性值必须要用引号括起来(单引号双引号均可)
—属性的命名规范和标签的相同
4.注释
<!-- xml的注释内容 -->
—注释不能嵌套,快捷键是ctrl+shift+/
5.特殊字符
—如果要将特殊字符直接写到xml中,需要用转义字符
<panduan>a>b</panduan>这样写是错误的
<panduan>a>b</panduan>
—常用转义字符有<:<
>:>
&:&
":"
':&qpos;
6.CDATA区
如果有很多的内容含有特殊字符,可以将其放到一个CDATA区中,这样就可以不必使用转义字符进行转义
写法:<![CDATA[内容]]>
<![CDATA[<b>if((a>b)&&(b>c)&&(c<d))</b>]]>
7.PI指令
—是处理指令,可以在xml中设置样式,但是基本不用,因为xml的功能不是主要用于显示数据的
<?xml-stylesheet type="text/css" href="css路径"?>
三、xml的约束
1.为什么要定义约束?
比如定义了一个person的xml文件,想要里面仅仅放入人的属性,但是如果在里面写一个猫的属性,系统并不会报错,因为符合语法规范,所以此时需要设置约束。
xml的约束技术有:dtd约束和schema约束
2.dtd快速入门
一个xml文件代码如下:
<?xml version="1.0" encoding="gbk"?>
<person>
<name>liqing</name>
<age>21</age>
</person>
—创建一个文件名,后缀为.dtd
步骤:(1)看xml文件中有多少元素,有几个元素,就在dtd文件中写几个<!ELEMENT>
,对于上述来说是3个
(2)判断元素是复杂元素还是简单元素
—复杂元素:有子元素的元素
<!ElEMENT 元素名称(子元素)>
<!ELEMENT person(name,age)>
—简单元素:没有子元素的元素
<!ElEMENT 元素名称 (#PCDATA)>
<!ELEMENT name (#PCDATA)>注意:空格。
<!ELEMENT age (#PCDATA)>name和age之后都有一个空格
(3)在xml中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">注意空格和大小写
<!DOCTYPE person SYSTEM "1.dtd">
3.dtd的引入方式
(1)引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
(2)使用内部的dtd文件
<!DOCTYPE person(根元素名称)[
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
(3)使用外部的dtd文件,使用网络上的一些dtd文件
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL">
—后面学到的框架会使用到
四、使用dtd定义元素
语法:
<!ELEMENT name (#PCDATA)>
<name>liqing</name>
(#PCDATA):表示name是字符串类型
<!ELEMENT sex EMPTY>
<sex></sex>
EMPTY:表示元素为空(没有内容)
<!ELEMENT school ANY>
ANY:可以为任意,可以空,也可以不为空
2.复杂元素的约束
<!ElEMENT 元素名称(子元素)>
<!ELEMENT person(name,age,sex,school)>
---这样写表示每个元素只能出现一次
如果出现多次,则需要使用以下符号(英文状态下)
+:一次或者多次
?:0次或者一次
*:任意次,0次或者多次
<!ELEMENT person (name+,age,sex,school)>
<person>
<name>liqing</name>
<name>li</name>
<name>qingqing</name>
<age>21</age>
<sex></sex>
<school>school</school>
</person>
子元素之间使用的符号意义
,(逗号):表示必须按照写的顺序来
<name>liqing</name>
<age>21</age>
<sex></sex>
<school>school</school>
|(竖线):表示只能出现其中的任意一个子元素
<age>21</age>
五、使用dtd定义属性
语法:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
注意:属性名称和属性类型以及属性的约束之间必须要有空格
属性的类型有三种:
(1)CDATA:表示字符串
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
<birthday ID1="AAA">2015</birthday>
(2)枚举:表示只能在指定范围内出现值,但是只能每次出现一个
<!ELEMENT age (#PCDATA)>
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
<age ID2="AA">21</age>
(3) ID:值只能以字母或者下划线开头,值得是属性的值
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID3 ID #REQUIRED
>
<name ID3="A1">liqing</name>
属性约束:
(1)#REQUIRED:属性必须要存在,不写会报错
(2)#IMPLIED:属性可有可无
(3)#FIXED:表示一个固定值,如果设置属性的值,必须是你dtd里面设置的
<!ELEMENT sex EMPTY>
<!ATTLIST sex
ID4 CDATA #FIXED "AAA"
>
<sex ID4="AAA"></sex>
(4)直接值:如果在dtd里面设置了,但是在xml中没有设置,则xml中会默认使用dtd中设置的,如果xml中另设置值,则使用xml中设置的
<!ELEMENT school ANY>
<!ATTLIST school
ID5 CDATA "VVV"
>
<school>school</school>
或者按照下面的
<school ID5="TTT">school</school>
六、实体的定义
定义实体时需要写在内部dtd中,如果写在外部dtd中,在某些浏览器下可能不会实现
语法:
<!ENTITY 实体名称 实体的值>
使用实体:&实体名称;
<!ENTITY TEST "LIQING">
<name ID3="A1">&TEST;</name>
在浏览器显示时会显示
<name ID3="A1">LIQING</name>
七、以上全部代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE person SYSTEM "1.dtd"> -->
<!DOCTYPE person[
<!ELEMENT person (name+,age?,sex*,school,birthday)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID3 ID #REQUIRED
>
<!ELEMENT age (#PCDATA)>
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
<!ELEMENT sex EMPTY>
<!ATTLIST sex
ID4 CDATA #FIXED "AAA"
>
<!ELEMENT school ANY>
<!ATTLIST school
ID5 CDATA "VVV"
>
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
<!ENTITY TEST "LIQING">
]>
<person>
<name ID3="A1">&TEST;</name>
<age ID2="AA">21</age>
<sex ID4="AAA"></sex>
<school>school</school>
<birthday ID1="AAA">2015</birthday>
</person>
八、案例
TV.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE SYSTEM "TV.dtd">
<TVSCHEDULE NAME="CCTV">
<CHANNEL CHAN="CCC">
<BANNER>AAA</BANNER>
<DAY>
<DATE>2015-11-11</DATE>
<HOLIDAY>SSSS</HOLIDAY>
</DAY>
<DAY>
<DATE>2015-12-12</DATE>
<PROGRAMSLOT VTR="SSS">
<TIME>1990</TIME>
<TITLE>TEST</TITLE>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
</TVSCHEDULE>
TV.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>