XML可拓展标记语言
XML:可扩展标记语言(eXtensible Markup Language)
通常指字符串,而不是文件
.XML文件
.XML文件是保存XML数据的一种方式
XML数据也可以以其他的方式存在(如在内存中构建XML数据)
不要将XML语言狭隘的理解成XML文件
特性
- 具有平台无关性,是一门独立的标记语言(不依赖,单独存在也是有意义的)
系统平台无关性:XML文件不论是在windows系统还是苹果系统打开,都是一样的
语言平台无关性:不论由java还是python还是其他语言进行解析,看到的效果特性都是一样的,因此可以跨语言 - 具有自我描述性(自己描述自己)
作用
网络数据传输(一般用JSON)
(有层次、很清晰地区分一段数据里的内容)数据存储(基本不用)
(重要数据实现互通,方便程序读取)- 配置文件(用的最多)
语法
1、 文档声明
必须放在第一行
<?xml version="1.0" encoding="UTF-8"?>
版本:1.0
编码:UTF-8
2、 描述内容(关键部分)
XML : 可扩展标记语言(eXtensible Markup Language)
描述的内容,即标记 ( 元素 / 标签 / 节点) ,标记之间允许重名
- 元素:描述包含关系
- 标签:语法
- 节点:加载的时候通常以节点方式展开
XML文档,由一个个的标记组成
开始标记(开放标记): <标记名称>
结束标记(闭合标记): </标记名称>
- 标记名称:(自定义名称,必须遵循以下命名规则)
1.可以含字母、数字以及其他的字符
2.不能以数字或者标点符号开始
3.不能以字符 “xml”(或者 XML、Xml)开始
4.不能包含空格,不能包含冒号(:)
5.区分大小写 - 标记内容:
开始标记与结束标记之间
例如,通过标记,描述一个name:<name>入错行的北北</name>
3、 标记嵌套
标记可以嵌套,但是不允许交叉
可以嵌套:
<person>
<name>张三</name>
<age>18</age>
</person>
不允许交叉(name和age):
<person>
<name>张三<age></name>
18</age>
</person>
4、 属性
标记除了开始和结束 , 还有属性
标记中的属性,在标记开始时 描述,由属性名和属性值组成
格式:
在开始标记中, 描述属性
可以包含0-n个属性, 每一个属性是一个键值对
属性名不允许重复 ,键与值之间使用等号连接,多个属性之间使用空格分割(换行or空白字符都可以)
属性值必须被引号引住
代码示例:
<persons>
<person id="10001" groupid="1"> <!--标记属性,在标记开始时描述-->
<name>李四</name>
<age>18</age>
</person>
<person id="10002" groupid="1">
<name>李四</name>
<age>20</age>
</person>
</persons>
5、 注释
注释不能写在文档声明前
注释间不能嵌套
格式:
注释开始: <!–
注释结束: -->
6、 根标记
标记与标记嵌套过程中最外层的部分叫做根,必须有且只能有一个根标记
names位于最外层,这段代码中有且仅有names一个根标记:
<names>
<name>张三</name>
<name>李四</name>
</names>
两个name都在最外层,无法区别哪个是根
<name>李四</name>
<name>麻子</name>
7、 层级称呼
层级称呼:子标记(后代标记的一种)、父标记、兄弟标记、后代标记、祖先标记
- 子标记(后代标记的一种):上下相邻的被包含部分
- 父标记:上下相邻的外层部分
- 兄弟标记:同级
- 后代标记:被包含部分
- 祖先标记:外层部分
例如:
name是person的子标记,也是person的后代标记
person是name的父标记,也是name的祖先标记
name是persons的后代标记
persons是name的祖先标记
name与length护互为兄弟标记
对应代码如下:
<persons>
<person>
<name>李四</name>
<length>180cm</length>
</person>
<person>
<name>李四</name>
<length>170cm</length>
</person>
</persons>
解析
-
引入jar文件
dom4j.jar -
创建一个指向XML文件的输入流
FileInputStream fis = new FileInputStream(“xml文件的地址”); -
创建一个XML读取工具对象
SAXReader sr = new SAXReader(); -
使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis); -
通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();