1.SAX解析
解析方式是事件驱动机制!
SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始、结束、内容、属性时,触发事件,我们可以编写程序在这些事件发生时,进行相应的处理。
优点:分析能够立即开始,而不是等待所有的数据被处理;逐行加载,节省内存,有注意解析大于系统内存的文档;有时候不必解析整个文档,它可以在某个条件得到满足时停止解析
缺点:单项解析,无法定位文档层次,无法同时访问同一文档的不同怒分数据,因为逐行解析,当解析第n行时,第n-1行已经被释放了,无法进行操作了;无法得知事件发生时元素的层次,只能自己维护结点的父子关系;只解析方式,无法修改XML文档的内容。
2. DOM解析
是用与平台和语言无关的方式表示XML文档的官方
W3C
标准,分析该结构通常需要加载整个
文档和内存中建立文档树模型
.
程序员可以通过操作文档树
,
来完成数据的获取 修改 删除等
.
优点
: 文档在内存中加载,
允许对数据和结构做出更改
.
访问是双向的,可以在任何时候在树中双向解析数据。
缺点
:文档全部加载在内存中 ,
消耗资源大
3. JDOM解析
目的是成为Java
特定文档模型,它简化与
XML
的交互并且比使用
DOM
实现更快。由于是第一
个
Java
特定模型,
JDOM
一直得到大力推广和促进。
JDOM
文档声明其目的是
“
使用
20%
(或更少)的精力解决
80%
(或更多)
Java/XML
问题
”
(根据学习曲线假定为
20%
)
优点:
使用具体类而不是接口,简化了DOM
的
API
。
大量使用了
Java
集合类,方便了
Java
开发人员。
缺点:
没有较好的灵活性。
性能不是那么优异。
4. DOM4J解析
它是
JDOM
的一种智能分支。它合并了许多超出基本
XML
文档表示的功能,包括集成的
XPath
支持、
XML Schema
支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,
DOM4J
是一个非常优秀的
Java XML API
,具有性能优异、功能强大和极端易用使用的特点,同时它也是一
个开放源代码的软件。如今你可以看到越来越多的
Java
软件都在使用
DOM4J
来读写
XML
。
目前许多开源项目中大量采用
DOM4J ,
例如
:Hibernate
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @Description: TODO(这里用一句话描述这个类的作用)
* @Author admin
* @Date 2022/2/22 16:38
*/
public class Dom4j {
public static void main(String[] args) throws IOException, DocumentException {
//创建输入流
FileInputStream file=new FileInputStream("D:\\Test\\Java班\\练习\\src\\dom4j.xml");
//创建xml读取对象
SAXReader sar=new SAXReader();
//读取并获取文档
Document document = sar.read(file);
//通过文档获取根元素
Element rootElement = document.getRootElement();
//开始解析元素
System.out.println(rootElement.getName());
Element name = rootElement.element("name");
System.out.println(name.getText());
file.close();
//创建输入流
FileInputStream file1=new FileInputStream("D:\\Test\\Java班\\练习\\src\\dom4j.xml");
//创建读取xml的对象
SAXReader sar1=new SAXReader();
//读取xml
Document document1 = sar.read(file1);
//获取根节点
Element rootElement1 = document1.getRootElement();
//获取根节点里面的元素
Element name1 = rootElement1.element("name");
//打印元素里面的内容
System.out.println(name1.getText());
//关闭流
file1.close();
}
}