dom4j

1.什么事解析xml?
系统最终会从xml中读取数据.读取的过程就是解析.
CRUD => 增删该查 => create read update delete => 解析指的就是读.

2.什么事解析器?
就是用来解析xml的类.
过滤器,拦截器,监听器...都是具备相应功能的java类而已.

3.两个常见的解析xml的思路!
思想:
DOM:将文档中所有内容都封装成对象.读取时,将所有对象都加载到内存中.在内存中创建一颗dom树(记录对象间的关系)
优点:方便的进行增删该查.
缺点:会非常消耗内存.
sax:
优点:内存占用小.
dom4j:
把所有内存封装成了5类对象.
document
Element
Attribute
Text
Commons
共同的父类
node
Node的属性:
自身属性:
nodeType
nodeName
nodeValue
导航属性
找子节点的:firstChild lastChild childNodes
找父节点的:parentNode
找兄弟节点:nextSibling previosSibling
获得Element的方式
getElementsById ==> Document
getElementsByTagName ==> Document/Element
getElementsByClassName ==> Document/Element
getElementsByName ==> Document
对于增删改的操作:

SAX解析:
事件驱动的.pull解析类似.把xml文档的读取过程划分出五类时间。我们只要提供遇到每类事件做什么锦囊
优点:内存占用小
缺点:不能进行增删改查

DOM解析式由w3c推荐提出的.
Sax解析是由民间提出的.

3.JAXP ==> JDK提供的 ==> java api for xml parser
思想在java中的体现是接口
我们要开发的话需要接口的实现类
由各大解析器厂商提供实现接口的类

A a = new AImpl(); //Aimpl2;
A a = new AImpl2();

//--上面的切换实现类的方式,需要改源代码,太过原始 ---
A a = JAXP.getXXX(); ==> 配置文件 ==> 我们通过修改配置文件就可以实现切换实现类.

//泛型,反射
//1.读取配置文件
//2.取出用哪个实现类
//3.使用解析器加载xml文档 ==> document
//4. 获得所有学生元素的集合
//5. 遍历集合

DOM代码实现
//获得所有学生信息
//1. 获得jaxp工厂
//2. 通过工厂获得解析器实现类
//3. 使用解析器加载xml文档 ==> document
//4. 获得所有学生元素的集合
//5. 遍历集合
// 获得学生元素的number属性
//获得学生节点下的所有子节点(包括文本在内一共7个)
//遍历集合并提取我们想要的name age sex元素对象

Sax代码实现
//1 获得解析器工厂类
//2 获得解析器
//3 解析文档
//sax 1.0版本中前两个参数没有用,永远是null.
//参数3 告知开发者当前触发的元素是哪个元素.
//参数4 将标签上的属性 提供给你
//判断当前遇到的元素是否是student元素
//如果是 ==> 获得number属性

//作业1:Sax只取itcast0001

DOM4 J => 框架 ==>
DOM for java
JDOM DOM4J

DOM4J 整合两种思想(SAX DOM)的思想
使用sax的思想做读取xml.
又参照dom的思想,也在内存

//查询所有学生的所有信息
//1.获得根元素
//2.迭代根元素下的所有名叫student的子元素
//3.获得student元素的number属性
//4.student子元素的内容(name age sex)

//中文乱码


dom4j_第1张图片
image.png

//要保证写入的编码和读取的编码一致。
1.写入的编码如何控制?
XMLWriter writer = new XMLWriter(new PrintWriter())
2.读取的编码如何控制?

方法2:使用字节流绝对不会出现乱码!如下:
XMLWriter writer = new XMLWriter(new FileOutPputStream(),format);

//删除一个学生 itcast_0001
//1 获得根元素
//使用xPath找到我们需要元素
//定义xpath
String xpath = "//student[@number='itcast_0001']";
Element student = (Element) document.selectSingleNode(xpath);
//删除
System.out.println(student.getParent().remove(student));

//回写

Node document.selectSingleNode(xpath);

//效率太低
//2 获得所有学生元素
//3 遍历
//判断 => number属性是否为要删除的
//是 => 删除
//不是
//4 回写

//修改学生信息
//1. 定义xpath表达式
//2. 使用xpath查找
Element studentEle = (Element) document.selectSingleNode(xpath);
//3. 修改student元素的子元素name, age, sex内容
studentEle.element("name").setText("rose");

//作业2
studentDAO


dom4j_第2张图片
image.png

你可能感兴趣的:(dom4j)