DOM4J(Document Object Model for Java)
简单易用,采用Java集合框架,并完全支持DOM、SAX和JAXP。
应用非常广泛,目前许多开源项目中大量采用DOM4J,如无特殊要求,建议考虑使用dom4j
优点:
1、大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。
2、支持XPath。
3、有很好的性能。
缺点:
1、大量使用了接口,API较为复杂。
一 创建一个工程
1.首先需要倒入相关jar dom4j-2.0.0-RC1.jar
实现对xml进行读取
创建readXml类
package com.dom4j;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
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 ReadXml {
/**
* 读取xml文件
* @throws Exception
*/
@Test
public void readXMLDemo() throws Exception {
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File("book.xml"));
//获取根节点元素对象
Element node = document.getRootElement();
//遍历所有的元素节点
listNodes(node);
//elementMethod(node);
}
/**
* 遍历当前节点元素下面的所有(元素的)子节点
* @param node
*/
public void listNodes(Element node) {
System.out.println("当前节点的名称::" + node.getName());
// 获取当前节点的所有属性节点
List<Attribute> list = node.attributes();
// 遍历属性节点
for (Attribute attr : list) {
System.out.println(attr.getText() + "-----" + attr.getName()
+ "---" + attr.getValue());
}
if (!(node.getTextTrim().equals(""))) {
System.out.println("文本内容::::" + node.getText());
}
// 当前节点下面子节点迭代器
Iterator<Element> it = node.elementIterator();
// 遍历
while (it.hasNext()) {
// 获取某个子节点对象
Element e = it.next();
// 对子节点进行遍历
listNodes(e);
}
}
/**
* 介绍Element中的element方法和elements方法的使用
* @param node
*/
public void elementMethod(Element node) {
// 获取node节点中,子节点的元素名称为bookStore的元素节点。
Element e = node.element("book");
// 获取bookStore元素节点中,子节点为book的元素节点(可以看到只能获取第一个carname元素节点)
// Element carname = e.element("title");
// 获取book这个元素节点 中,所有子节点名称为title元素的节点 。
// List<Element> carnames = e.elements("title");
// for (Element cname : carnames) {
// System.out.println(cname.getText());
// }
// 获取book这个元素节点 所有元素的子节点。
List<Element> elements = e.elements();
for (Element el : elements) {
System.out.println(el.getName());
System.out.println(el.getText());
System.out.println("===============");
}
}
}
2.把xml数据写入到xml文件中
package com.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
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 writerXml {
/**
* 数据写入到xml文件
* @throws Exception
*/
@Test
public void createXMLDemo() throws Exception {
//获取Document对象
Document document = DocumentHelper.createDocument();
//获取xml文件的根路径
Element root = document.addElement("bookStore");
//通过根路径添加子元素
Element element= root.addElement("book");
//向book元素中添加属性与属性值
/**
* addAttribute 指的是当前节点的属性与方法
* addElement book节点下子节点的名称
* addText book节点下子节点的值
*/
element.addAttribute("id","1");
element.addElement("title").addAttribute("lang", "en").addText("《Java编程思想》");
element.addElement("author").addAttribute("lang", "en").addText("编程语言的骄子");
element.addElement("price").addAttribute("lang", "en").addText("200");
Element element1= root.addElement("book");
//向book元素中添加属性与属性值
/**
* addAttribute 指的是当前节点的属性与方法
* addElement book节点下子节点的名称
* addText book节点下子节点的值
*/
element1.addAttribute("id","2");
element1.addElement("title").addAttribute("lang", "en").addText("《Java编程思想》");
element1.addElement("author").addAttribute("lang", "en").addText("编程语言的骄子");
element1.addElement("price").addAttribute("lang", "en").addText("200");
// 写入到一个新的文件中
writer(document);
}
/**
* 把document对象写入新的文件
* @param document
* @throws Exception
*/
public void writer(Document document) throws Exception {
// 紧凑的格式
// OutputFormat format = OutputFormat.createCompactFormat();
// 排版缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("UTF-8");
// 创建XMLWriter对象,指定了写出文件及编码格式
// XMLWriter writer = new XMLWriter(new FileWriter(new
// File("a.xml")),format);
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream(new File("book.xml")),"UTF-8"), format);
writer.setEscapeText(false);
// 写入
writer.write(document);
// 立即写入
writer.flush();
// 关闭操作
writer.close();
}
对xml文件进行修改相关节点与节点的属性
package com.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
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 UpdateXml {
/**
* 修改属性
*/
@Test
public void update() {
try {
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File("book.xml"));
// 获取根节点元素对象
Element node = document.getRootElement();
Attribute attributes = node.element("book").element("title").attribute("lang");
attributes.setText("1");
Attribute id = node.element("book").attribute("id");
id.setText("10");
//xml文件内容的样式
OutputFormat format = OutputFormat.createPrettyPrint();
// 创建XMLWriter对象,指定了写出文件及编码格式
XMLWriter writer = new XMLWriter(
new OutputStreamWriter(new FileOutputStream(new File("book.xml")), "UTF-8"), format);
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向指定位置添加属性
*/
@Test
public void addElement() {
try {
SAXReader reader = new SAXReader();
Document document = reader.read("book.xml"); // 加载xml
Element desc = DocumentHelper.createElement("desc"); // 创建新的节点
desc.setText("新增加的属性"); // 设置节点值
List<Element> root = document.getRootElement().elements();
System.out.println(root.size());
for (int i = 0; i < root.size(); i++) {
if (i == 1) {
List<Element> elements = root.get(1).elements();
elements.add(0, desc);
// elements.remove(0);
}
}
// Element root = document.getRootElement();
// List<Element> list = root.element("book").elements();
// list.add(1, desc);
// 排版缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream(new File("book.xml")),"UTF-8"), format);
// 写入
writer.write(document);
// 立即写入
writer.flush();
// 关闭操作
writer.close();
System.out.println("添加完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}