Dom4j

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dom4j相关的知识,希望对你有一定的参考价值。

一、DOM4j简介

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

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

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


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

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<书架>
	<书>
		<书名>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<Element> 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<Element> 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<Element> books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}

book2.xml

<?xml version="1.0" encoding="UTF-8"?>

<书架> 
  <书> 
    <书名>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<Element> 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<Element> 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<Element> books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}

book3.xml

<?xml version="1.0" encoding="UTF-8"?>

<书架> 
  <书> 
    <书名>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<Element> 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<Element> 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<Element> 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<Element> 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<Element> 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<Element> books = root.elements("书");
		Element book2 = books.get(1);
		//获取作者的节点
		Element atutor2 = book2.element("作者");
		//获取文本内容
		String autor2Name = atutor2.getText();
		//输出文本的内容
		System.out.println("第二个作者是:"+autor2Name);
	}
}


本文出自 “11831428” 博客,请务必保留此出处http://11841428.blog.51cto.com/11831428/1905320

以上是关于Dom4j的主要内容,如果未能解决你的问题,请参考以下文章

Dom4j

dom4j 不兼容的类型: java.util.List (org.dom4j.Node)无法转换为java.util.List(org.dom4j.Element)

dom4j

XML——XML解析之DOM4J

dom4j读取xml

dom4j解析xmljavaweb三层架构初探