一、DOM4j简介

  DOM4j是一个简单、灵活的开放源代码的库。DOM4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,DOM4j使用接口和抽象类,虽然DOM4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

  DOM4j是一个非常优秀的Java XML API,具有性能优秀、功能强大和极易使用的特点。现在很多软件采用的是DOM4j,例如Hibernate。

  使用DOM4j开发,需要下载DOM4j相应的jar文件。


二、DOM4j获取作者的文本内容

book.xml


<书架>
	<书>
		<书名>Javaweb开发实战
		<作者>哈哈
		<售价>1.01
		<简介>垃圾
	
	<书>
		<书名>Java基础开发
		<作者>呵呵
		<售价>0.99
		<简介>这非常不错
	

DOM4j解析book.xml

package cn.dom4j;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class DOM4jTest {
	public static void main(String[] args) throws Exception {
		run();
		
	}
	/**
	 * 获取第二个作者的名字
	 */
	@SuppressWarnings("unchecked")
	public static void run() throws Exception {
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,获取DOcument对象
		Document document = reader.read("src/book.xml");
		//获取根节点--书架
		Element root = document.getRootElement();
		//获得书的节点,获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}


三、在末尾添加节点

package cn.dom4j;

import java.io.FileOutputStream;
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;

public class DOM4jTest {


	public static void main(String[] args) throws Exception {
		add();
		
	}
	/**
	 * 在第二本下添加节点
	 */
	@SuppressWarnings("unchecked")
	public static void add() throws Exception{
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,返回Document对象
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		//获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//可以直接在第二本书下添加子节点,设置文本内容
		book2.addElement("狗").addText("阿拉斯加神狗");
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 获取第二个作者的名字
	 */
	@SuppressWarnings("unchecked")
	public static void run() throws Exception {
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,获取DOcument对象
		Document document = reader.read("src/book.xml");
		//获取根节点--书架
		Element root = document.getRootElement();
		//获得书的节点,获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}

book2.xml



<书架> 
  <书> 
    <书名>Javaweb开发实战  
    <作者>哈哈  
    <售价>1.01  
    <简介>垃圾 
    
  <书> 
    <书名>Java基础开发  
    <作者>呵呵  
    <售价>0.99  
    <简介>这非常不错  
    <狗>阿拉斯加神狗
   


四、在指定的位置添加子节点

package cn.dom4j;

import java.io.FileOutputStream;
import java.util.List;

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;

public class DOM4jTest {


	public static void main(String[] args) throws Exception {
		addToSpecialPosition();
		
	}
	/**
	 * 在指定的位置添加子节点
	 * 在第二本的作者之前添加团购价的标签
	 */
	public static void addToSpecialPosition() throws Exception{ 
		// 获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		// 获取第二本书
		Element book2 = (Element) root.elements("书").get(1);
		//获取书下的所有子节点,返回List集合
		List list = book2.elements();
		//创建元素对象
		Element GroupPurchasePrice = DocumentHelper.createElement("团购价").addText("0.01");
		//list.add(int index,Element element)
		list.add(1, GroupPurchasePrice);
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book3.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 在第二本下添加节点
	 */
	@SuppressWarnings("unchecked")
	public static void add() throws Exception{
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,返回Document对象
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		//获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//可以直接在第二本书下添加子节点,设置文本内容
		book2.addElement("狗").addText("阿拉斯加神狗");
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 获取第二个作者的名字
	 */
	@SuppressWarnings("unchecked")
	public static void run() throws Exception {
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,获取DOcument对象
		Document document = reader.read("src/book.xml");
		//获取根节点--书架
		Element root = document.getRootElement();
		//获得书的节点,获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}

book3.xml



<书架> 
  <书> 
    <书名>Javaweb开发实战  
    <作者>哈哈  
    <售价>1.01  
    <简介>垃圾 
    
  <书> 
    <书名>Java基础开发  
    <团购价>0.01
    <作者>呵呵  
    <售价>0.99  
    <简介>这非常不错 
   


五、删除和修改文档

package cn.dom4j;

import java.io.FileOutputStream;
import java.util.List;

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;

public class DOM4jTest {


	public static void main(String[] args) throws Exception {
		deleteSpecialPosition();
		
	}
	/**
	 * 删除子节点
	 * 删除第二本下的团购价的标签
	 */
	public static void deleteSpecialPosition() throws Exception{
		// 获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML
		Document document = reader.read("src/book3.xml");
		//获取根节点
		Element root = document.getRootElement();
		// 获取第二本书
		Element book2 = (Element) root.elements("书").get(1);
		Element GroupPurchasePrice = book2.element("团购价");
		GroupPurchasePrice.getParent().remove(GroupPurchasePrice);
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book3.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 在指定的位置添加子节点
	 * 在第二本的作者之前添加团购价的标签
	 */
	public static void addToSpecialPosition() throws Exception{ 
		// 获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		// 获取第二本书
		Element book2 = (Element) root.elements("书").get(1);
		//获取书下的所有子节点,返回List集合
		List list = book2.elements();
		//创建元素对象
		Element GroupPurchasePrice = DocumentHelper.createElement("团购价").addText("0.01");
		//list.add(int index,Element element)
		list.add(1, GroupPurchasePrice);
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book3.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 在第二本下添加节点
	 */
	@SuppressWarnings("unchecked")
	public static void add() throws Exception{
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,返回Document对象
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		//获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//可以直接在第二本书下添加子节点,设置文本内容
		book2.addElement("狗").addText("阿拉斯加神狗");
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 获取第二个作者的名字
	 */
	@SuppressWarnings("unchecked")
	public static void run() throws Exception {
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,获取DOcument对象
		Document document = reader.read("src/book.xml");
		//获取根节点--书架
		Element root = document.getRootElement();
		//获得书的节点,获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}
package cn.dom4j;

import java.io.FileOutputStream;
import java.util.List;

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;

public class DOM4jTest {


	public static void main(String[] args) throws Exception {
		update();
		
	}
	/**
	 * 修改文本内容
	 */
	public static void update()throws Exception{
		// 获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML
		Document document = reader.read("src/book2.xml");
		//获取根节点
		Element root = document.getRootElement();
		// 获取第二本书
		Element book2 = (Element) root.elements("书").get(1);
		//可以直接在第二本书下添加子节点,设置文本内容
		book2.element("狗").setText("二哈");
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	/**
	 * 删除子节点
	 * 删除第二本下的团购价的标签
	 */
	public static void deleteSpecialPosition() throws Exception{
		// 获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML
		Document document = reader.read("src/book3.xml");
		//获取根节点
		Element root = document.getRootElement();
		// 获取第二本书
		Element book2 = (Element) root.elements("书").get(1);
		Element GroupPurchasePrice = book2.element("团购价");
		GroupPurchasePrice.getParent().remove(GroupPurchasePrice);
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book3.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 在指定的位置添加子节点
	 * 在第二本的作者之前添加团购价的标签
	 */
	public static void addToSpecialPosition() throws Exception{ 
		// 获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		// 获取第二本书
		Element book2 = (Element) root.elements("书").get(1);
		//获取书下的所有子节点,返回List集合
		List list = book2.elements();
		//创建元素对象
		Element GroupPurchasePrice = DocumentHelper.createElement("团购价").addText("0.01");
		//list.add(int index,Element element)
		list.add(1, GroupPurchasePrice);
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book3.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 在第二本下添加节点
	 */
	@SuppressWarnings("unchecked")
	public static void add() throws Exception{
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,返回Document对象
		Document document = reader.read("src/book.xml");
		//获取根节点
		Element root = document.getRootElement();
		//获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//可以直接在第二本书下添加子节点,设置文本内容
		book2.addElement("狗").addText("阿拉斯加神狗");
		//回写
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), OutputFormat.createPrettyPrint() );
		writer.write(document);
		writer.close();
	}
	
	
	/**
	 * 获取第二个作者的名字
	 */
	@SuppressWarnings("unchecked")
	public static void run() throws Exception {
		//获取解析器对象
		SAXReader reader = new SAXReader();
		//解析XML,获取DOcument对象
		Document document = reader.read("src/book.xml");
		//获取根节点--书架
		Element root = document.getRootElement();
		//获得书的节点,获取第二本书
		List books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}