XML概述
文章目录
- XML概述
- 一、什么 是XML
- 二、XML和HTML
- 三、XML语法
- 1.文档声明
- 2.元素定义
- 3.属性定义
- 四、DTD
- 1.什么是约束
- 2.DTD约束
- 3.DTD的引入
- 4.DTD语法
- (1)元素定义
- (2)属性定义
- (3)属性类型
一、什么 是XML
由于不同语言之间数据传递的格式有可能不兼容,导致这些项目在数据传输时变得很困难,因此W3C组织退出一种新的数据交换标准–XML,是一种通用的数据交换格式。
所以XML的作用是用于两个程序间进行通信,并且当服务器程序启动时,去读取它应当监听的端口号,还有连接数据库的用户名和密码,充当小型的数据库。
通常XML文件保存这种具有树状结构的数据是最好的选择。
XML是一种类似于HTML的标记语言,称为可扩展标记语言。可扩展就是指用户可以按照xml的规则自定义标记。
二、XML和HTML
(一)HTML用于显示数据,但是XML用于存储和传输数据
(二)HTML没有区分大小写,XML是严格区分大小写的。
(三)HTML可以有多个根,但格式良好的XML只允许一个根
(四)HTML的标记是预定义的,但XML的标记是自己定义的。
三、XML语法
1.文档声明
完整的xml文档中,必须包含一个xml文档的声明,并且声明必须位于文档的第一行。
声明语法如下:
<?XML版本信息 【编码信息】【文档独立性信息】?>
表明了该文档是xml文档以及遵循了哪个版本。
格式为:<? 内容 ?>中间声明版本,编码信息和文档独立性信息,
**<?xml version="1.0" encoding="UTF-8"? standalone=“yes”>**
默认情况下,standalone的值为“no”,表示文档依赖于外部文档。
2.元素定义
<城市 地点="中山">
<学校>初中,高中,大学</学校>
<超市>
<书>
<书名>xxx</书名>
<作者 姓名="某某某"></作者>
<售价 单位="元"></售价>
</书>
</超市>
</城市>
<学校>:元素 姓名=“某某某”:属性
一般来说,元素是由标记、属性、元素内容、结束标语(</学校>)组成。
3.属性定义
可以自定义属性,但是属性的命名规范同元素时,属性值必须用“”(双引号)或“(单引号),否则视为错误。注释用<!-- xxx -->
四、DTD
1.什么是约束
<城市 地点="中山">
<学校>初中,高中,大学</学校>
<超市>
<书>
<书名>xxx</书名>
<作者 姓名="某某某"></作者>
<售价 单位="元">68</售价>
<售价 单元="元">45</售价>
</书>
</超市>
</城市>
像上面的XML文档结构正确,但同时出现两种售价,所以在XML文档定义了约束规则,用来约束文档内容。最常用的是DTD约束和Schema约束。
2.DTD约束
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>hello、java</书名>
<作者>xxx</作者>
<价格>45</价格>
</书>
<书>
<书名>c++</书名>
<作者>xxxx</作者>
<价格>23</价格>
</书>
</书架>
表2——2
<!DOCTYPE 书架[
<!ELEMENT 书 (#PCDATA)>
<!ELEMENT 书架 (书+)>
<!ELEMENT 书编号 (#PCDATA)>
<!ELEMENT 书名 (#PCDATA)]>
表2-3(shu.dtd)
表2-2中的XML文档是根据shu.dtd所规定的约束进行编写。对shu.dtd的解析如下
(1)第一行<!LEMENT ...>定义了一个元素,其中“书架”是元素名称,“(书+)”指书架有1~n个书元素
(2)”书(书名,作者,售价)“表示元素”书“包含”书名“、”作者“、”售价“三个子元素,并且需要按照顺序依次出现。
(3)3~5行“(#PCDATA)”表示元素中嵌套的内容是普通的文本字符串。
3.DTD的引入
在XML文档中引入外部DTD文件有两种方法:
<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
<!DOCTYPE 根元素名称 PUBLIC "DTD名称">
例如上面的外部应用格式为
如果引用本地的DTD,则使用的是第一行的声明语句,引入公共的DTD文件则使用PUBLOIC。
如:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2.3.dtd">
第二行是指DTD名称。
DTD对XML文档的约束,除了外部引入方式实现外,还可以采用内嵌如:
<!DOCTYPE 书架[
<!ELEMENT 书架 (书+)>
<!ELEMENT 书编号 (#PCDATA)>
<!ELEMENT 书 (书编号) >
<!ATTLIST 书编号 编号 ID #REQUIRED>]>
后面再加上XML文档的自定义元素内容。
通常采用外部引用的方式约束XML文档,避免重复被多个XML引用。也方便维护和管理。
4.DTD语法
(1)元素定义
<!ELEMENT 元素名称 元素内容>
“元素名称”为自定义,“元素内容”包括数据类型和符号两部分,包括五种内容形式,具体如下。
(1)#PCDATA表示嵌套内容为普通文本字符串
(2)子元素:如<!ELEMENT 书名 (书名,售价,作者)>
(3)混合内容:表示可以包含字符数据,也可以包含子元素,<!ELEMENT 书名(#PCDATA)*> 表示书中嵌套的子元素书名包含0~n,且书名为字符串文本格式。
(4)EMPTY:表示既不包含字符数据,也不包含子元素。是一个空元素
(5)ANY:表示可以包含任何的字符数据和子元素,但应该尽量避免使用,因为除了根元素外,其他使用的都会失去约束效果。
(2)属性定义
DTD属性定义的基本语法格式如下:
<!ATTLIST 元素名
属性名1 属性类型 设置说明
属性名2 属性类型 设置说明
......>
设置说明的类型如下:
1.#PEQUIRED:表示该属性是必须的
#FIXED:表示固定的属性默认值
#IMPLIED: 表示元素可以包含或者不包含该属性
默认值:如果元素不包含该属性则被自动设置为默认值
(3)属性类型
一共有10种,常用的为
(1)CDATA:字符数据与#PCDATA相同,
(2)Enumerated(枚举):通常省略,如:
<!ATTLIST 肉 品种 (鸡肉|牛肉|猪肉|鱼肉)"鸡肉">
默认值为“鸡肉”,即没有“品种”这个属性,且取值为“鸡肉”。
(3)ID
ID的属性必须为#IMPLIED或#REQUIRED 例如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架[
<!ELEMENT 书架 (书+)>
<!ELEMENT 书编号 (#PCDATA)>
<!ELEMENT 书 (书编号) >
<!ATTLIST 书编号 编号 ID #REQUIRED>]>
<书架>
<书>
<书编号 编号="id1">1</书编号>
</书>
<书>
<书编号 编号="id2">2</书编号>
</书>
</书架>
(4)IDREF和IDREFS
如上面代码所示,虽然俩本书的编号唯一,但是ID是属性没有发挥作用,
<!DOCTYPE 书架[
<!ELEMENT 书架 (书+)>
<!ELEMENT 书编号 (#PCDATA)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 书 (书编号,书名) >
<!ATTLIST 书编号 编号 ID #REQUIRED
第几本 IDREF #IMPLIED>]>
<书架>
<书>
<书名 第几本="id1">明朝那些事儿1</书名>
<书编号 编号="id1">1</书编号>
</书>
<书>
<书名 第几本="id2">明朝那些事儿2</书名>
<书编号 编号="id2">2</书编号>
</书>
</书架>
如上述,给书加上第几本的属性,该属性的类型设置为IDREF,IDREF属性的值必须赋给一个已经存在的ID类型,如此一来“id1”为第一本《明朝那些事儿1》,“id2”为《明朝那些事儿2》,这样子俩本书之间就有了联系,
IDREF表示一对一的关系,但是IDEEF表示一对多的关系,例如有学生同时借了“id1”和“id2”这两本书,
<!DOCTYPE 书架[
<!ELEMENT 书架 (书+)>
<!ELEMENT 书编号 (#PCDATA)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 书 (书编号,书名) >
<!ELEMENT 学号 (#PCDATA)>
<!ELEMENT person EMPTY>
<!ELEMENT person borrow IDREFS #REQUIRED>
<!ELEMENT data (#PCDATA)>
<!ELEMENT 学生 (data,person) >
<!ATTLIST 书编号 编号 ID #REQUIRED
第几本 IDREF #IMPLIED>]>
<图书馆>
<书架>
<书>
<书名 第几本="id1">明朝那些事儿1</书名>
<书编号 编号="id1">1</书编号>
</书>
<书>
<书名 第几本="id2">明朝那些事儿2</书名>
<书编号 编号="id2">2</书编号>
</书>
</书架>
<学生>
<data>2022-3-9</data>
<person name="张三" borrow="id1 id2"></person>
</学生>
</图书馆>
除上面这些属性类型外,DTD约束还有NMTOKEN,NMTOKEMS,NOTATION,ENTIITY,ENITITYS这几种。