XML学习和事例

XML可以说是一个小型的数据库
他的所以的标签都是自己定义的

什么是元素

什么是元素看一下 下面的代码
元素有开始标签,元素内容和结束标签组成
看一下面的代码
<note>是开始标签

`Tove
Jani
Reminder

Don't forget me this weekend! `是元素内容 是结束标签

完整代码:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

XML语法

标签对大小写敏感
必须正确嵌套
代码

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

代码介绍
这个是和html的<!DOCTYPE html>差不多

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

下面这个是根元素

1
2
3
<note>
.....
</note>

下面这4个都是子元素

1
2
3
4
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>

DTD学习和事例

他有两种声明方式,内部和外部

XML的内部DTD声明

声明格式

1
<!DOCTYPE 根元素 [元素声明]>

!DOCTYPE 用来声明限制根元素的
!ELEMENT 用来声明限制元素的

1
<!DOCTYPE 根元素 [!ELEMENT 内部元素]>

事例和!ELEMENT的限制

!ELEMENT 用来声明限制元素的

声明只能出现一次的子元素

正确代码:
下面的代码介绍
第二行!DOCTYPE 声明名字是note的根元素
第三行!ELEMENT 限制note根元素必须有一个to的子元素
第三行!ELEMENT 有限制了to的子元素限制成#PCDATA的类型
#PCDATA的类型介绍在下面

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to)>
<!ELEMENT to (#PCDATA)>
]>
<note>
<to>aaaaa</to>
</note>

错误的代码:
错误介绍
其他的解释上面都说了
报错的原因是
在第三行 !ELEMENT 设置了note根元素就只限制了一个子元素to

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to)>
<!ELEMENT to (#PCDATA)>
]>
<note>
<to>aaaaa</to>
<to>bbbbb</to>
</note>

声明最少出现一次子元素用’+’

上面的只能出现一次的子元素声明了两个to就报错了
我们加上+可以就可以解决这个问题了,但是必须有一个to子元素
下面的代码介绍:
其他代码就不说了
主要在第三行加了一个+ 意思就是!ELEMENT 限制 根元素note必须有一个或者多个to的子元素

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to+)>
<!ELEMENT to (#PCDATA)>
]>
<note>
<to>aaaaa</to>
<to>bbbbb</to>
</note>
零次或多次的元素用’*’

下面代码的意思
!DOCTYPE 声明根元素是note
主要在第三行加*他限制零次或多次的元素 意思就是!ELEMENT 限制note根元素的子元素to*出现几次都可以
!ELEMENT

代码

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to*)>
<!ELEMENT to (#PCDATA)>
]>
<note>
<to>aaaaa</to>
<to>bbbbb</to>
<to>ccccc</to>
</note>

他声明多个to子元素没有报错

声明出现零次或一次的元素用’?’

下面代码的意思
!DOCTYPE 声明根元素是note
主要在第三行加? 意思就是!ELEMENT 限制了note根元素的子元素to?只能出现零次或一次to的元素
!ELEMENT
代码

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to?)>
<!ELEMENT to (#PCDATA)>
]>
<note>

</note>

没有声明to元素他没有报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to*)>
<!ELEMENT to (from,heading)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>
<from>Jani</from>
<heading>Reminder</heading>
</to>
<to>
<from>Jani</from>
<heading>Reminder</heading>
</to>
</note>

属性声明语法

什么是属性

看一下,下面的html代码
src 就是属性
a.png就是属性的值
XML属性值必须用” “

1
<img src="a.png">
属性声明格式

属性生明用的是!ATTLIST

1
<!ATTLIST 元素名称 属性名称 属性类型 默认值>

下面是属性的类型
常用的是CDATA,就是字符串类型

他的默认值

属性事例

下面代码说明
第二行!DOCTYPE 声明名字是note的根元素
第三行!ELEMENT 限制note根元素必须有一个to的子元素
第三行!ELEMENT 有限制了to的子元素限制里面必须有ab子元素
第四行!ATTLIST 被添加元素的是to子元素,属性名是id,类型是CDATA是字符类型的,#REQUIRED意思是属性值是必需的
第五行和第六行 都是声明ac子元素的类型的

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to)>
<!ELEMENT to (a,c)>
<!ATTLIST to id CDATA #REQUIRED>
<!ELEMENT a (#PCDATA)>
<!ELEMENT c (#PCDATA)>
]>
<note>
<to id="1">
<a>a</a>
<c>b</c>
</to>
</note>

XML的外部DTD声明

他的dtd声明在XML内部声明已经说了
外部声明用SYSTEM

1
<!DOCTYPE 根元素 SYSTEM [文件地址]>

事例

下面这个是XML的内部DTD声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to+)>
<!ELEMENT to (from,heading)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>
<from>Jani</from>
<heading>Reminder</heading>
</to>
<to>
<from>Jani</from>
<heading>Reminder</heading>
</to>
</note>

叫上面这个改成外部声明很简单
例:
a.xml文件
内容

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "a.dtd">
<note>
<to>
<from>Jani</from>
<heading>Reminder</heading>
</to>
<to>
<from>Jani</from>
<heading>Reminder</heading>
</to>
</note>

a.dtd文件
内容

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT note (to+)>
<!ELEMENT to (from,heading)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

看一下结果可以的