一、简介

1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录:

docs目录:帮助文档的目录,单击index.html:

Quick start是快速入门超链接,主要参考这里的代码完成对dom4j的认识,并完成CRUD的操作。

Javdoc(1.6.1)是dom4j的帮助文档,需要查找相关信息的时候主要参考这里。

lib目录:该目录下有相关若干jar包,他们是dom4j-1.6.1.jar的依赖文件,当使用XPath解析XML文档提示错误信息的时候,应当将该文件夹下面的相关jar文件加入路径。

src目录:该目录存放源文件,可以压缩该目录以便于查找源代码。

2.使用dom4j的好处。

最大的好处就是能够大大简化对XML文档的操作。

但应当注意,导包的时候应当导入的包是dom4j的包,而不是原来的包了,比如:Document对象应当导入的包名为:org.dom4j.Document。

3.准备工作:对项目名称右键单击,新建目录lib,对着该目录右键单击,新建目录dom4j,将相关的jar文件复制到该目录中,选中所有的jar文件,右键build path->addtobuildpath,效果图:

另外Books类

 package p00.domain;

 public class Book {
public String title;
public double price;
public String id;
public String getId()
{
return id;
}
public void setId(String id)
{
this.id=id;
}
public String getTitle()
{
return title;
}
public double getPrice()
{
return price;
}
public void setTitle(String title)
{
this.title=title;
}
public void setPrice(double price)
{
this.price=price;
}
public String toString()
{
return "图书ISBN为:"+id+" 书名为:"+title+" 价格为:"+price;
} }

books.xml文档:

 <?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="book1">
<title>JAVA编程思想</title>
<price>80.00</price>
</book>
<book id="book2">
<title>JAVA核心技术</title>
<price>100.00</price>
</book>
</books>

持久化保存到xml文档的方法。

使用第一种方法:

 private static void writeToNewXMLDocument(Document document) throws Exception {
FileWriter fw=new FileWriter("xmldata/newbooks.xml");
OutputFormat of=OutputFormat.createPrettyPrint();
of.setEncoding("gbk");//如果改为utf-8则出现乱码。
XMLWriter writer=new XMLWriter(fw,of);
writer.write(document);
writer.close();//注意不要忘记关流。
}

使用该方法出现了中文乱码问题,原因是文件编码为gbk,二文件内容编码为utf-8,产生原因不明。因此改用另外一种方法,该方法使用OutputStreamWriter类实现特定编码方式的写入,解决了中文乱码问题

   /**
* 通过document对象将内存中的dom树保存到新的xml文档,使用特定的编码方式:utf-8。
* @param document
* @throws Exception
*/
private static void writeToNewXMLDocument(Document document) throws Exception {
FileOutputStream fos=new FileOutputStream(new File("xmldata/newbooks.xml"));
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
/**
*使用这种写法才不会产生乱码
*/
XMLWriter writer=new XMLWriter(osw);
writer.write(document);
writer.close();
}

二、CRUD操作。

1、读取(R)

 private static List<Book> readAllElementsFromXMLDocument(Document document) {
List<Book>books=new ArrayList<Book>();
Element root=document.getRootElement();
List list=root.elements();
for(int i=0;i<list.size();i++)
{
Element book=(Element) list.get(i);
Book b=new Book();
String id=book.attributeValue("id");
List ll=book.elements();
b.setId(id);
System.out.println(id);
for(int j=0;j<ll.size();j++)
{
Element element=(Element) ll.get(j);
if("title".equals(element.getName()))
{
String title=element.getText();
b.setTitle(title);
System.out.println(title);
}
if("price".equals(element.getName()))
{
String price=element.getText();
double p=Double.parseDouble(price);
b.setPrice(p);
System.out.println(price);
}
}
books.add(b);
}
return books;
}

效果图:

2、修改(U)

     /**
* 该方法的作用是修改document中的内容
* 将id为b002的元素的title改为Java Core,Price改为100.01
* @param document
*/
private static void ModifyInformationOfXMLDocument(Document document) {
Element root=document.getRootElement();
List books=root.elements();
for(int i=0;i<books.size();i++)
{ Element book=(Element) books.get(i);
if("book2".equals(book.attributeValue("id")))
{
for(Iterator it=book.elementIterator();it.hasNext();)
{
Element node=(Element) it.next();
String type=node.getName();
if("title".equals(type))
{
node.setText("JAVA Core");
}
if("price".equals(type))
{
node.setText("100.01");
}
}
}
}
}

效果图:

<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="book1">
<title>JAVA编程思想</title>
<price>80.00</price>
</book>
<book id="book2">
<title>JAVA Core</title>
<price>100.01</price>
</book>
</books>

3、删除(D)

 /**
* 该方法实现了使用dom4j的删除元素的功能
* @param document
*/
private static void deleteInformationOfXMLDocument(Document document) {
Element root=document.getRootElement();
for(Iterator it=root.elementIterator();it.hasNext();)
{
Element book=(Element) it.next();
String id=book.attributeValue("id");
if("book1".equals(id))
{
Element parent=book.getParent();
parent.remove(book);
}
}
}

效果图:

<?xml version="1.0" encoding="UTF-8"?>
<books> <book id="book2">
<title>JAVA核心技术</title>
<price>100.00</price>
</book>
</books>

4、添加(C)

  /**
* 实现了添加新节点:book的功能
* @param document
*/
private static void addNewBookToXMLDocument(Document document) {
Element root=document.getRootElement();
Element newBook=root.addElement("book");
newBook.addAttribute("id", "book3");
Element title=newBook.addElement("title");
title.setText("凤姐玉照");
Element price=newBook.addElement("price");
price.setText("10000.01");
}

效果图:

<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="book1">
<title>JAVA编程思想</title>
<price>80.00</price>
</book>
<book id="book2">
<title>JAVA核心技术</title>
<price>100.00</price>
</book>
<book id="book3"><title>凤姐玉照</title><price>10000.01</price></book></books>

5.完整代码

 package p03.CRUDToXMLDocumentByDom4j;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
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 p00.domain.Book; /**
* 该类通过dom4j技术实现了对xml文档的增删改查。
* @author kdyzm
*
*/
public class SetAllElementsByDom4j {
public static void main(String args[]) throws Exception
{
/**
* 第一步,得到document对象。
*/
Document document=getDocument(); /**
* 第二步,修改得到的document对象
*/ /**
* 首先,读取功能
*/
// List<Book>books=readAllElementsFromXMLDocument(document);
// traverseBooks(books); /**
* 其次,修改功能
* 修改内容:将id为b002的元素的title改为Java Core,Price改为100.01
*/
// ModifyInformationOfXMLDocument(document); /**
* 再者:实现删除功能
* 删除内容:删除掉id为book1的元素内容。
*/
// deleteInformationOfXMLDocument(document); /**
* 最后:实现添加i新元素功能
* 添加内容:id为book3,title内容为:凤姐玉照,price内容为10000.00
*/
// addNewBookToXMLDocument(document); /**
* 第三步:将得到的document对象持久化保存到硬盘(XML)
*/
writeToNewXMLDocument(document);
}
/**
* 实现了添加新节点:book的功能
* @param document
*/
private static void addNewBookToXMLDocument(Document document) {
Element root=document.getRootElement();
Element newBook=root.addElement("book");
newBook.addAttribute("id", "book3");
Element title=newBook.addElement("title");
title.setText("凤姐玉照");
Element price=newBook.addElement("price");
price.setText("10000.01");
} /**
* 该方法实现了使用dom4j的删除元素的功能
* @param document
*/
private static void deleteInformationOfXMLDocument(Document document) {
Element root=document.getRootElement();
for(Iterator it=root.elementIterator();it.hasNext();)
{
Element book=(Element) it.next();
String id=book.attributeValue("id");
if("book1".equals(id))
{
Element parent=book.getParent();
parent.remove(book);
}
}
} /**
* 该方法的作用是修改document中的内容
* 将id为b002的元素的title改为Java Core,Price改为100.01
* @param document
*/
private static void ModifyInformationOfXMLDocument(Document document) {
Element root=document.getRootElement();
List books=root.elements();
for(int i=0;i<books.size();i++)
{ Element book=(Element) books.get(i);
if("book2".equals(book.attributeValue("id")))
{
for(Iterator it=book.elementIterator();it.hasNext();)
{
Element node=(Element) it.next();
String type=node.getName();
if("title".equals(type))
{
node.setText("JAVA Core");
}
if("price".equals(type))
{
node.setText("100.01");
}
}
}
}
}
/**
* 遍历集合
* @param books
*/
private static void traverseBooks(List<Book> books) {
for(Iterator<Book>iterator=books.iterator();iterator.hasNext();)
{
Book book=iterator.next();
System.out.println(book);
}
}
/**
* 该方法实现了对xml文档的读取功能
* @param document
* @return
*/
private static List<Book> readAllElementsFromXMLDocument(Document document) {
List<Book>books=new ArrayList<Book>();
Element root=document.getRootElement();
List list=root.elements();
for(int i=0;i<list.size();i++)
{
Element book=(Element) list.get(i);
Book b=new Book();
String id=book.attributeValue("id");
List ll=book.elements();
b.setId(id);
System.out.println(id);
for(int j=0;j<ll.size();j++)
{
Element element=(Element) ll.get(j);
if("title".equals(element.getName()))
{
String title=element.getText();
b.setTitle(title);
System.out.println(title);
}
if("price".equals(element.getName()))
{
String price=element.getText();
double p=Double.parseDouble(price);
b.setPrice(p);
System.out.println(price);
}
}
books.add(b);
}
return books;
}
/**
* 通过document对象将内存中的dom树保存到新的xml文档,使用特定的编码方式:utf-8。
* @param document
* @throws Exception
*/
private static void writeToNewXMLDocument(Document document) throws Exception {
FileOutputStream fos=new FileOutputStream(new File("xmldata/newbooks.xml"));
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
/**
*使用这种写法才不会产生乱码
*/
XMLWriter writer=new XMLWriter(osw);
writer.write(document);
writer.close();
} /**
* 该方法用于得到document对象。
* @return
* @throws Exception
*/
private static Document getDocument() throws Exception {
SAXReader sr=new SAXReader();
Document document=sr.read("xmldata/books.xml");
return document;
}
}

三、总结

使用dom4j大大减少了代码量,提供了编码效率,推荐使用该方法对XML文档进行解析。

四、使用XPath精确查找制定元素,优化dom4j的解析过程,减少代码量。

最新文章

  1. Android之ScrollView嵌套ListView和GridView冲突
  2. EF接触03
  3. iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传
  4. oracle将两个结果连接后进行查询,得到两个查询的联合结果
  5. C#读取注册表信息
  6. table行转列
  7. abiword Namespace List
  8. thinkphp从数据库里的html代码显示页面不解析
  9. 提高SQL执行效率
  10. Xcode的小标记旁边的文件的名称的作用
  11. poj-1056-IMMEDIATE DECODABILITY(字典)
  12. 查看python中模块的所有方法
  13. 《一头扎进SpringMvc视频教程》Rest风格的资源URL
  14. asp.net core MVC 控制器,接收参数,数据绑定
  15. PowerDesiger 生成C#实体类,字段转变成大小写方法
  16. 在Hadoop集群上的Hive配置
  17. golang 编译或链接 c语言动态、静态库的方法, golang 与 c语言 相互调用
  18. onclick 常用手册
  19. php生成word,并下载
  20. 联想预装Win10/Win8换Win7 教程 以及svn使用教程

热门文章

  1. cvGet2D的用法
  2. 算法题解之math类题
  3. RPC(Remote Procedure Call Protocol)——远程过程调用协议 学习总结
  4. Javascript闭包——懂不懂由你,反正我是懂了
  5. C# 毕业证书打印《三》
  6. [20160731]read a file and print it on the screen
  7. 堆栈指针 ---delete 使用
  8. 在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法
  9. Java使用for循环打印乘法口诀(正倒左右三角形)
  10. C Primer Plus_第二章_C语言概述_复习题与编程练习