1.初识
1.1 概念
- Extensible Markup Language 可扩展标记语言
- 可扩展:标签都是可以自定义的
1.2 功能
- 存储数据
- 当做配置文件
- 在网络中传输
1.3 与html的区别
- xml的标签都是自定义的,html标签的是预定义的
- xml的语法严格,html语法松散
- xml是存储数据,html是展示数据
2.语法
2.1基本语法
- xml文档的后缀名为.xml
- xml第一行必须定义为文档声明
- xml文档有且仅有一个根标签
- 属性名必须用引号(单双都可)引起来
- 标签必须正确关闭
- xm标签名称区分大小写
2.2 快速入门
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
</user>
</users>
2.3 组成部分
-
文档说明
-
格式:
<?xml 属性列表 ?>
-
属性
- version:版本号。必须的属性。
- encoding:编码方式。告知解析引擎当前文档所使用的字符集。
- standalone:是否独立。yes/no,是否依赖其他文件
-
-
指令(了解):结合CSS
-
标签:标签名称是自定义的
- 规则
- 可以包含数字、字母或其他的字符
- 名称不能以数字或标点符号开始
- 名称不能以xml开始
- 名称不能包含空格
- 规则
-
属性
- id属性值唯一
-
文本
- CDATA区:在该区域中的数据会被原样展示
3. 约束
3.1 概念
-
规定了xml文档的书写规则
-
作为框架的使用者(程序员)需要做到:
- 能够在xml中引入约束文档
- 能够简单读懂约束文档
-
框架需要解析xml,但xml的标签是可扩展的,每个程序员的标签名称可能不一样,所以需要一个**说明文档(约束)**来对xml编写制定规则,程序员根据规则来进行xml的编写
3.2 分类
1.DTD:一种简单的约束技术
-
文件以.dtd后缀结尾
-
引入dtd文档到xml文档中:
-
内部dtd:将约束规则定义在xml文档中(不常用)
-
外部dtd:将约束规则定义在外部的dtd文件中
<!--本地--> <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置"> <!--网络--> <!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
-
2.Schema:一种复杂的约束技术
-
能够详细定义标签中属性的值和类型等
-
文件以.xsd后缀结尾
-
读懂引入schema文档
<!-- 1.填写xml文档的根元素 2.引入xsi前缀 3.引入xsd文件命名空间 4.为每一个xsd约束声明一个前缀,作为标识 --> <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast.cn/xml student.xsd" xmlns:a="http://www.itcast.cn/xml " </students> <!-- 1.students:根元素 2.xis前缀 3.schemaLocation命名空间中"http...."为约束说明 4.a是约束前缀,如果不加默认为空的时候的约束说明 如果有多个约束说明 在后面使用的时候,<a:stduents>代表使用的是a,<b:stduents>代表使用的是b, -->
4. 解析
概念
操作xml文档,将文档的数据读取到内存中
操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
4.1解析xml的方式
DOM(常用于服务端)
- 将标记语言文档一次性加载进内存,在内存中形成一颗DOM树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存,因为是一次性加载,而且数据结构是为树,一般加载进来后所占内存是文档的上千倍
SAX(常用于客户端)
- 逐行读取,基于事件驱动(如读到某标签后执行某操作)
- 优点:不占内存。每次读取都是一行,读取下一行的时候释放上一行
- 缺点:只能读取,不能进行CRUD操作
4.2 常见的xml解析器
JAXP:sun公司提供的解析器,支持dom和sax两种思想
DOM4J:一款非常优秀的解析器
Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。但解析XML也是没有问题的
PULL:Android操作系统内置的解析器,sax方式的
4.3 Jsoup
快速入门
-
导入jar包或者maven依赖
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.14.3</version> </dependency>
-
获取Document对象
-
获取对应标签Element对
-
获取数据
public class JsoupDemo {
public static void main(String[] args) throws IOException {
//1.获取students.xml的path
String path = JsoupDemo.class.getClassLoader().getResource("students.xml").getPath();
//2.解析xml文档,加载文档进内存,获取 dom树 ——> document
Document document = Jsoup.parse(new File(path), "utf-8");
//3.获取元素对象 Elements
Elements elements = document.getElementsByTag("name");
//获取第一个name的element对象,然后获取数据
Element element = elements.get(0);
System.out.println(element.text());
}
}
对象
-
Jsoup:工具类。可以解析html或xml文档,返回Docoment
-
parse:解析html或xml文档,返回Document(dom树)
//解析html或xml文件的 /* charsetName 字符编码 */ Jsoup.parse(File in,String charsetName); //解析html或xml字符串的 Jsoup.parse(String html); //通过网络路径获取指定的html或xml的文档对象 /* timeoutMillis 超时时间 */ Jsoup.parse(URL url,int timeoutMillis)
-
-
Document:文档对象。代表内存中的dom树
-
获取Element对象
//根据ID属性值获取唯一的Element对象 getElementById(String id) //根据标签名称获取 元素对象集合 getElementsByTag(String tagName); //根据属性名称获取 元素对象集合 getElementsByAttribute(String key); //根据属性名称和属性值获取 元素对象集合 getElementsByAttributeValue(String key,String value);
-
-
Elements:元素Element对象的集合,可以当做ArrayList
-
Element:元素对象
-
获取子元素对象
//根据ID属性值获取唯一的Element对象 getElementById(String id) //根据标签名称获取 元素对象集合 getElementsByTag(String tagName); //根据属性名称获取 元素对象集合 getElementsByAttribute(String key); //根据属性名称和属性值获取 元素对象集合 getElementsByAttributeValue(String key,String value);
-
获取属性值
//根据属性名称获取属性值 String arrt(String key);
-
获取文本内容
//获取子标签的纯文本内容 String text(); //获取标签体的所有内容(包括子标签的字符串内容) String html();
-
-
Node:节点对象
选择器
-
selector
Elements select(String cssQuery); //语法参考 selector 定义的语法
-
XPath
- XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
-
使用Jsoup的XPath需要导入额外的jar包
//根据document对象 创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//结合xpath语法进行查询
jxDocument.selN()