Dom4j 和前段时间学习的 DOM 类似,但是不同的是DOM4J是第三方公司制作的,学了一下他的基本语法,感觉确实更加好用,
我主要是收悉了一下用Dom4j来对XML文档进行增删改查。代码贴上分享
xml文档
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="b1212">
<name>我不是jack</name>
<age>22</age>
</user>
<user id="A002">
<name>张三</name>
<age>24</age>
</user>
<user id="B001">
<name>小李</name>
<age>20</age>
</user>
<user id="B002">
<name>小张</name>
<age>28</age>
</user>
<user id="C001">
<name>刘备</name>
<age>35</age>
<user id="1111">ZJH</user>
</user>
<hncu id="888">
<name>湖南城市大学</name>
<age>15</age>
</hncu>
<user id="12121">
<name>周会飞</name>
<age>18</age>
</user>
</users>
我老师用的代码:主要知识点更多,值得注意的地方都加了注解
package cn.hncu.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
/**
*
* 学习方法:
* 1) 打开dom4j项目包中docs/index.html --> Quick Start --> 在这一页中介绍了dom4j的基本操作
* 2) index.html --> javadoc(1.6.1) --> 进入该版本的API文档,可以查看每个包中的类及方法的说明
* 3) 官网: http://www.dom4j.org/
*
*/
public class Dom4jDemo {
@Test
public void hello() throws DocumentException{
//获取dom对象
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");
//获取根元素
Element root = dom.getRootElement();
//获取子元素
/*
root.element(name) //获取指定名称的第一个元素
root.elementIterator();//获取所有的子元素---迭代器
root.elementIterator(name);//获取指定名称的所有子元素
root.elements();//获取所有的子元素---java.util.List
root.elements(name) //获取指定名称的所有子元素
root.attributeIterator(); //获取所有的属性
*/
//需求: 把第一个<user>元素的信息获取出来
Element eUser = root.element("user");
String id = eUser.attributeValue("id");
String name = eUser.element("name").getText();
String age = eUser.elementText("age");
System.out.println(id+","+name+","+age);
}
//CRUD--增删改查演示
//查---遍历所有<user>
@Test
public void queryAll() throws DocumentException {
Document dom = new SAXReader().read("./xml/users.xml");
Element root = dom.getRootElement();
Iterator<Element> it = root.elementIterator();
while(it.hasNext()){
Element eUser = it.next();
String id = eUser.attributeValue("id");
String name = eUser.element("name").getText();
String age = eUser.elementText("age");
System.out.println(id+","+name+","+age);
}
}
//增---在root下添加一个<hncu>节点
@Test
public void add() throws Exception {
Document dom = new SAXReader().read(new File("./xml/users.xml"));
Element root = dom.getRootElement();
//创建一个新的元素节点
Element eHncu = root.addElement("hncu");
Element eName = eHncu.addElement("name");
eName.setText("湖南城市学院");
Element eAge = eHncu.addElement("age");
eAge.setText("15");
eHncu.addAttribute("id", "666");
///以下这段专门演示保存功能/
//保存---持久化---字符流要刷缓存
//法1:简易方式 ---直接通过Document中的一个write(Writer w)来实现
/*
FileWriter fw = new FileWriter("./xml/users.xml");
dom.write( fw );
fw.close();
*/
//法2:普通方式---通过XMLWriter中的一个write(dom)
/*2.1用 构造 XMLWriter(OutputStream)
XMLWriter xw = new XMLWriter( new FileOutputStream("./xml/users.xml"));
xw.write(dom);
xw.close();
*/
/*2.2用 构造 XMLWriter(Writer)
XMLWriter xw = new XMLWriter( new FileWriter("./xml/users.xml") );
xw.write(dom);
xw.close();
*/
// 2.3用 构造 XMLWriter(OutputStream,OutputFormat) ---以指定的格式输出,可以解决中文乱码
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/users.xml"), format);
xw.write(dom);
xw.close();
}
//删---删除最后一个元素
@Test
public void del() throws Exception {
Document dom = new SAXReader().read("./xml/users.xml");
Element root = dom.getRootElement();
//获取最后一个元素
List<Element> list = root.elements();
Element eLast = list.get( list.size()-1 );
eLast.getParent().remove(eLast); // remove()删除的是直接孩子节点
//保存
XMLWriter xw = new XMLWriter( new FileOutputStream("./xml/users.xml"));
xw.write(dom);
xw.close();
}
//改---把最后一个元素的id属性 和 <name>中的文本内容修改了
@Test
public void update() throws Exception {
Document dom = new SAXReader().read("./xml/users.xml");
Element root = dom.getRootElement();
//获取最后一个元素
List<Element> list = root.elements();
Element eLast = list.get( list.size()-1 );
//修改id属性 和 <name>中的文本内容
eLast.addAttribute("id", "888");//若该属性存在是修改,否则是添加
eLast.element("name").setText("湖南城市大学");
//保存
XMLWriter xw = new XMLWriter( new FileOutputStream("./xml/users.xml"));
xw.write(dom);
xw.close();
}
}
下面这个是我练习的时候写的代码
package cn.hncu.dom4j;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Dom4jDemo2 {
//获取子元素
/*
root.element(name) //获取指定名称的第一个元素
root.elementIterator();//获取所有的子元素---迭代器
root.elementIterator(name);//获取指定名称的所有子元素
root.elements();//获取所有的子元素---java.util.List
root.elements(name) //获取指定名称的所有子元素
root.attributeIterator(); //获取所有的属性
*/
// 改-- 修改最后一个user元素的属性
@Test
public void update() throws Exception{
System.out.println("33333");
SAXReader reader = new SAXReader();
Document dom = reader.read("./xml/users.xml");
Element root = dom.getRootElement();
Element eUser = root.element("user");
eUser.setAttributeValue("id", "b1212");
Element name =eUser.element("name");
name.setText("我不是jack");
save(dom, 3);
query();
}
// 删-- 删除最后一个user元素
@Test
public void del() throws Exception{
System.out.println("1111");
SAXReader reader = new SAXReader();
Document dom = reader.read("./xml/users.xml");
Element root = dom.getRootElement();
// 先找到再删
List<Element> list = root.elements("user");
Element elastUser = list.get( list.size()-1);
elastUser.getParent().remove(elastUser);
// 保存
save(dom, 3);
query();
}
@Test
public void add() throws Exception{
System.out.println("222");
SAXReader reader = new SAXReader();
Document dom = reader.read("./xml/users.xml");
Element root = dom.getRootElement();
Element user =root.addElement("user");
user.addAttribute("id", "12121");
Element name =user.addElement("name");
name.setText("周会飞");
Element age =user.addElement("age");
age.setText("18");
// 会按照格式输出
/* OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xw = new XMLWriter( new FileWriter("./xml/users.xml"),format);
xw.write(dom);
xw.close();*/
save(dom, 3);
query();
}
// 查---
public void query() throws Exception{
/* SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;*/
// 拿到dom
SAXReader reader = new SAXReader();
Document dom = reader.read("./xml/users.xml");
Element root = dom.getRootElement(); // 拿到根元素
List<Element> users =root.elements("user");
System.out.println("id\t姓名\t年龄");
System.out.println("--------------------");
for(int i=0;i<users.size();i++){
Element e = users.get(i);
String id= e.attributeValue("id");
String name = e.element("name").getText();
String age = e.element("age").getText();
System.out.println(id+"\t"+name+"\t"+age);
}
}
private void save (Document dom,int i) throws Exception{
//保存---持久化---字符流要刷缓存
//法1:简易方式 ---直接通过Document中的一个write(Writer w)来实现
if(i==1){
FileWriter fw = new FileWriter("./xml/users.xml");
dom.write( fw );
fw.close();
}
//法2:普通方式---通过XMLWriter中的一个write(dom)
//*2.1用 构造 XMLWriter(OutputStream)
if(i==2){
XMLWriter xw = new XMLWriter( new FileOutputStream("./xml/users.xml"));
xw.write(dom);
xw.close();
/*2.2用 构造 XMLWriter(Writer)
XMLWriter xw = new XMLWriter( new FileWriter("./xml/users.xml") );
xw.write(dom);
xw.close();
*/
}
if(i==3){
// 2.3用 构造 XMLWriter(OutputStream,OutputFormat) ---以指定的格式输出,可以解决中文乱码
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/users.xml"), format);
xw.write(dom);
xw.close();
}
}
}
—分割线—–
Dom4j 有个技术就是,创建一个新的xml文档。我刚刚写了一个贴上
package cn.hncu.dom4j;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
* 创建一个全新的xml文档
* @author<a href="mailto:953801304@qq.com">胡龙华</a>
* @version 2017-5-30 上午10:17:52
* @fileName dom4j.java
* 关键类或方法:DocumentHelper
*/
public class dom4j {
public static void main(String[] args) throws Exception{
// 在内存里面创建好了dom
Document dom = DocumentHelper.createDocument();
// 创建根元素
Element root =dom.addElement("端午节");
root.setText("端午节快乐!");
//保存成一个文档
OutputFormat format = OutputFormat.createCompactFormat();
format.setEncoding("GB2312");
XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/duanwu.xml"), format);
xw.write(dom);
xw.close();
}
}
创建好的XML文档在这里
<?xml version="1.0" encoding="GB2312"?>
<端午节>端午节快乐!</端午节>