XML 可扩展标记语言
一、什么是标记语言
标记语言就是一种由特定意义的符号组成的文档,这些符号用来指明文档内容的结构和含义。
目前常用的标记语言有两种:
- XML:Extensible Markup Language,可扩展的标记语言
- HTML:Hyper Text Maryup Language,超文本标记语言
标记语言的本质实际上就是一种格式特殊的文本信息。
标记语言通常不是给“人”来看的,而是用来给特定的程序解析。
HTML通常由浏览器软件解析,用来描述如何绘制网页。
XML通常由我们自己编写的程序解析,用来保存项目中的一些轻量级数据或者一些配置信息,也作为轻量级数据传输的载体。
-
XML和HTML的区别
-
用途不同
HTML主要用于显示界面,而XML主要用于保存和传输数据。
-
可扩展性
XML是可扩展的,而HTML是不可扩展的。
XML中所有的标识符都可以是自定义的,灵活度较高。
而HTML中所有的标识符都必须使用预定义的。
-
语法要求不同
作为标记语言,XML和HTML大致语法都是相同的,例如标签、属性、元素、注释、文档声明……相对来说,XML语言语法要求要更严格一点,HTML语法要更宽松一点。
跟语言本身没有关系,目前主流的浏览器开发商(IE、Google Chrome、FireFox、Opera、Safari……)都将浏览器的解析引擎设计得容错率比较高。也就是说,在HTML文档中如果出现少量的语法错误,多数情况下浏览器仍然能够解析并显示出正确的内容。
-
二、了解XML中的基本概念
-
Tag 标签
标记标签,简称标签。
标记语言中所有的组成部分都属于“标记”,例如:标签、注释、文本、声明、文档类型……其中最常用的,也是主要的数据载体就是标签。
语法:
<标签名> 标签体 </标签名>
在XML中标签必须成对出现,一个叫做开始标签,一个叫做结束标签。
开始标签和结束标签的标签名必须一致,结束标签中加“/”符号。
开始标签中可以包含一些属性,结束标签中不能包含属性。
开始标签和结束标签之间的空间叫做标签体。标签体中可以包含一些其他的对象:文本、注释、其他子标签……
<country> <province> <city>昆山市</city> </province> </country>
-
Element 元素
在标记语言中,元素和标签所表达的意思有一定的相近之处,但是所关注的重点是不同的。注意:元素≠标签
一组标签只强调:
- 由“<” + 标签名 + “>”组成开始标签
- 由“<” + “/” + 标签名 + “>”组成结束标签
我们提到“标签”概念的时候,并不关注它从哪里开始、到哪里结束、包含哪些内容、具有哪些属性……
一个元素就代表从一个开始标签到它对应的结束标签范围内的所有对象。包括标签、属性、注释、文本。
-
Attribute 属性
属性就是对元素进行额外的说明,出现在一个元素的开始标签当中。
属性必须以键值对形式存在。属性值必须加双引号。
一个元素可以有多组属性,每组属性之间使用空格进行分割。
一个属性可以对应多个属性值,多个属性值之间使用空格进行分割。
-
Comments 注释
语法:
<!-- 注释内容 --> <!-- 注释内容 注释内容 注释内容 -->
三、如何编辑一个XML文档
XML就是一种特殊格式的文本信息,里面都是一些可以经过字符编码的内容。
所以任何文本编辑器都可以编写XML文档。
例如:记事本、EditPlus、Notepad++、Sublime……
除此之外,目前主流的IDE工具都集成了XML编辑器,功能非常强大。
例如:Eclipse、VSCode、MyEclipse、IDEA、NetBeans……
四、如何编写一个结构良好/格式良好的XML文档
-
1、必须拥有头部声明
<?xml version="1.0" encoding="UTF-8"?>
-
2、每个XML文档必须有且只有一个根元素
根元素:直接定义在XML源文件中的元素,没有被其他元素包含。
也就是说,直接定义在源文件中的元素只能有一个,文档中的其他所有的元素都必须直接或间接包含在这个元素当中。
整个XML文档中的所有的元素应该构成一颗树形结构。
-
3、XML中的标签名和属性名是大小写敏感的
大小写敏感:区分大小写
<hello></Hello> <!-- 一组不合法的标签定义 -->
-
4、标签必须成对出现
XML中的标签必须正确地关闭。
在HTML中,有些标签允许没有结束标签。
-
5、元素必须正确地嵌套
一个元素必须完整地被嵌套在另一个元素中,不能出现如下情况:
<student> <teacher> </student> </teacher> <!-- 不合法的嵌套 -->
子元素的开始标签和结束标签必须都出现在父元素的开始标签和结束标签之间。
正确的写法:
<student> <teacher></teacher> </student>
-
6、XML中的命名规则
-
名称可以包含字母、数字以及其他标点符号
建议:尽量不要出现字符,如果需要连接单词,最好使用“_”。
-
名称不能以数字或者标点符号开头
-
名称不能包含关键字,不能使用“xml”单词的任何大小写组合形式充当名称
都是错误的命名
-
名称中不能包含空格
-
五、如何书写一个有效的XML文档
有效的XML指的是能够被程序正确解析,不会出现错误的文档。
必须满足两个条件:
- 首先它必须是一个结构良好的文档
- 必须使用DTD/XSD进行约束
六、XML文档约束
XML本身存在很高的灵活度,所以可能每个人编写的XML文档差异都很大。导致标准不能得到统一,使用程序对其进行解析的难度很大。所以需要出台一套规章制度,用来约束文档必须如何去写。
约束:指定规则,说明哪些内容在文档中是合法的,哪些内容是不合法的。
标记文档的约束有两种形式:
- DTD,主要约束文档的内容
- XSD(Schema),本质上其实就是XML,主要对文档的结构进行定义。
七、使用DTD声明文档约束
DTD有两种使用方式:
- 内部式:把DTD约束内容直接书写在XML文档当中,作为一种内容存在
- 外部式:单独把DTD代码书写在一个.dtd文件中,然后在XML中引用它
只是书写的位置不同,但是语法没有任何区别。
1、内部式语法
在根元素的外边声明一下内容:
<!DOCTYPE 根元素名称 [内容声明]>
内容声明:允许出现哪些元素、不允许出现哪些元素、元素必须按照什么顺序排列、每种元素能够出现多少次、元素中必须拥有哪些属性、属性是什么类型、有无默认值、属性是否是必要的……
内容声明中,可以有两种形式:
- <!ELEMENT> 对元素进行约束
- <!ATTLIST> 对元素中的属性进行约束
元素约束
<!ELEMENT 元素名称 (内容)>
<!ELEMENT 元素名称 类型>
#PCDATA:可解析的字符内容,Parseable Character Data
如果声明某个元素是该类型的话,意思就是强调该元素内不能有其他子元素,只能有文本数据。
八、关于字符转义的问题
当我们在XML定义包含类似“<”这样的字符时,解析可能会出现一定的问题。
因为“<”在XML具有特殊含义,解析器会把它当成一个新元素的开始标记。
对于这样的特殊字符,我们必须要对其进行转义。
转义有两种方式:
- 1、使用实体引用
在 XML 中有 5 个预定义的实体引用:
引用内容 | 符号 | 小于 |
---|---|---|
<; | < | 小于 |
>; | > | 大于 |
&; | & | 和号 |
&apos; | ’ | 单引号 |
"; | " | 双引号 |
**注释:**严格地讲,在 XML 中仅有字符 “<“和”&” 是非法的。引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
- 2、使用CDATA特殊标记
语法:<![CDATA[<]]>
九、XML文档的解析
XML文档中的内容多数情况下是给程序解析使用的。
主要介绍三种解析的方法:
-
1、SAX解析
SAX:simple API for XML,简单的、轻量级的解析方法
基于事件驱动式、类似爬虫式的解析方式。
优点:节省内存,不会占用太多的系统资源,适合进行一些大文件的解析
缺点:不能回读。SAX解析是一个从头到尾一次性的过程。而且只能读取,不能写入。
-
2、DOM解析
DOM:Document Object Model,文档对象模型。
DOM在开始读取数据之前,先把整个XML文档都读取一遍,把它完整地加载到内存当中,变成一颗树形结构文档对象。之后,我们需要读取什么信息,就可以直接从这个对象上去获取。
优点:支持随机访问,可以回读。可以在任意时刻获取文档中任意位置的数据。
缺点:占用内存,如果解析一些较大的文件,可能会导致内存溢出。
这两种方法都是JDK原生API中所包含的解析方式,不要求掌握。
-
3、使用Dom4j解析XML
Dom4j是一个开源、免费、易用性极高的第三方框架。
Dom for Java框架:别人写好的代码,我们直接拿来用。
如果需要使用第三方框架、插件,也需要先到网上下载对应的jar包。
下载下来之后,把它放到我们工程的类加载路径中,我们就可以在我们的代码中使用这个jar包中包含的类、接口、方法。
Eclipse中如何导入Jar包:
1、把下载好的jar文件复制到工程中任意一个位置
jar包拷贝到工程中之后还不能直接使用。
如果想要使用,必须执行第二个步骤:
2、把jar文件添加到构建路径中
在jar文件右击 --> Build Path --> Add to Build Path