XML:可扩展的标记语言。
XML用途:
- 统一的数据文件规范。统一
- 统一的解析API。易于使用
- 使用非常广泛。大小写敏感
XML实体引用:
< :< (小于)
> :> (大于)
& :&(与)
' :'(单引号)
" :" (双引号)
XML格式:
一般情况下都是UTF-8编码,支持国际化。
处理指令(简称 PI):
是一个可选指令,用于指示XML解析器(XML API)如何处理XML文件,一般都会写在XML文件第一行。
处理指令的起始:<?
处理指令的结束:?>
一条完整的处理指令:<?xml version="1.0" encoding="UTF-8"?>
- version="1.0" 用于指定XML版本,至今一直是1.0
- encoding="UTF-8" 是指XML中文字编码,建议使用UTF-8,建议不要改变任何字符,原封不动的写
- standalone 是否允许使用外部声明(yes/no)yes指不适用外部声明
标记(tag)
标记由'<'开始,由'>'结束,中间是标记名(区分大小写)
例如:标记名可以任意扩展,建议使用英文作为标记名 <books>
标记分为开始标记:<books> 和结束标记:</books>
XML规定,标记必须成对使用,只有一个唯一的根标签。
标签的嵌套可以任意扩展。
注释:
<!-- 这里是注释的内容 -->,以’<!--‘开始,以'-->'结尾。
属性 attribute:
开始标签上可以定义属性,属性名=”属性值“(等号前后不能加空格,且单双引号均可)
- 属性名可以任意扩展,但是不能重复;
- 属性值可以任意扩展,必须使用引号(单双引号均可);
- 在开始标记中可以定义多个属性,属性没有顺序。
内容 content:
开始标记和结束标记之间称为内容,内容可以是:
- 文本内容(<name>钢铁是怎样练成的</name>,这里的文字就是文本内容不包括一对标签)
- 子标记
- 子标记和文本混合
元素 element:
开始标记 + 内容 + 结束标记 :这个整体统称为元素(<name>)注,标记的名也作为元素的名。
可以有空元素:没有内用的元素,可以省略为自结束标记
例:<name></name>,这里name元素没有内容,可以省略为<name/>(自结束标记)
PCADTA 指被解析的字符数据:
CDATA段 格式:<![CDATA[文本内容]]>
文本内用不会被解析,并且结尾']]>'不能有空格和换行。
XML语法是如何扩展的:
XML是可扩展标记语言,“其可扩展”表现为:
- 标记名(元素名)可以任意扩展
- 标记的嵌套关系可以任意扩展,或者元素的嵌套关系可以任意扩展
- 元素的属性可以任意扩展
XML API:
- 用于读取XML文件,写ML文件
- 提供非常简化访问方法
- XML API能自动识别XML语法(能识别元素,内容,属性,标记等),可以按照标记,属性等会去信息
常见的XML API(解析方式)
- SAX API 是底层API,很少直接使用,是一边扫描,一边解析,速度很快,但不能对节点做修改。是W3C组织定义的API。
- DOM API 是底层API,构造树形结构,可以遍历和修更改节点。
- Dom4j 是对标准DOM的封装扩展,其底层仍然是DOM,在DOM基础之上提供了更加简化的操作API,成为行业标准API。
- Dom4j 是第三方API,需要导入到项目中使用。
Dom4J API:
利用maven导入Dom4j API。
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
SAXReader:
Dom4j读取解析XML文件的api,可以将一个xml文件读取解析为Document对象。
Document 文档:
Document 对象代表一个XML文件解析以后的内存对象,其数据结构与原始的xml文件结构相同。
读取内存中的Document对啊ing,就相当于读取了xml文件的内容,document对象提供了查找根元素的方法。
SAXReader reader = new SAXReader();
Document doc = reader.read("D:\\a.xml");
Element root = doc.getRootElement();
List<Element> list = root.gelments();
Element 元素
代表xml中的一个元素,读取到内存中的对象。Element 对象可以代表根元素,也可以代表子元素。
Element 提供了查找子元素的方法:
- 查找第一个满足条件子元素,适合查找唯一一个元素的时候:e.element(子元素名);
- 查找元素的全部子元素,不区别名字查找全部子元素,适合子元素名字都一样的情况,返回一个集合:e.elements();
- 查找元素中名字是“子元素名”,全部子元素很多,名字不相同,找出相同名字的一组子元素:e.elements(元素名);
获取元素文本内用的方法:e.getText();
获取当前元素的元素名: e.getName();
获取元素的属性方法:
List<Element> list = root.elements();
int i = 0;
for(Element e : list){
// 从0 开始
Attribute attr = e.attribute(i++);
Attribute attr1 = e.attribute("name");
// 属性名
String name = attr.getName();
// 属性值
String value = attr.getValue();
}