Dom4j基础

dom4j是一个非常非常优秀的Java XML API,用来读写XML文件,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。

本章主要介绍dom4j的基础操作。以下结合实例说明。

目录结构:

关键代码:

package com.alfred.main;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import com.alfred.util.Dom4jUtil;

public class Main {

	public static void main(String[] args) throws Exception {
		// 获取document对象,三种方法
		Document doc = Dom4jUtil.getDocument();

		// 打印文档结构
		// Dom4jUtil.printDocument(doc);

		// 打印文档的结构 使用dom4j输出重定向
		 Dom4jUtil.printDocumentByDom4j(doc);

		// 对节点的操作
		// elementOper(doc);

		// 对节点属性的操作
		// elementAttributeOper(doc);

		// 将document写入文件
		// writeDocumentToXml(doc);

		// document的其他操作
		// documentOtherOper();

	}

	/**
	 * 对节点的操作
	 *
	 * @param doc
	 */
	private static void elementOper(Document doc) {
		// 获取文档的根节点
		Element root = doc.getRootElement();

		// ===========================查询 begin
		// 获取某个节点的子节点
		Element position = root.element("position");
		// 获取节点的文字内容 position.getTextTrim();去掉前后空格
		String positionText = position.getText();
		System.out.println("positionText:" + positionText);

		Element employees = root.element("employees");
		// 获取某节点下所有名为“employee”的子节点,并进行遍历
		List employeeList = employees.elements("employee");
		for (Iterator it = employeeList.iterator(); it.hasNext();) {
			Element elm = (Element) it.next();
		}
		// 获取某节点下所有子节点
		List elementList = employees.elements();

		// 对某节点下的所有子节点进行遍历
		for (Iterator it = employees.elementIterator(); it.hasNext();) {
			Element element = (Element) it.next();
		}
		// ===========================查询 end

		// ===========================新增 begin
		// 在某节点下添加子节点
		Element compbirthday = root.addElement("compbirthday");
		// 设置节点内容
		compbirthday.setText("1970-10-10");
		// 添加CDATA内容
		compbirthday.addCDATA("cdata区域");
		// ===========================新增 end

		// ===========================删除 begin
		Element name = root.element("name");
		// 删除节点
		boolean issuccess = root.remove(name);
		// ===========================删除 end
	}

	/**
	 * 对节点属性的操作
	 *
	 * @param doc
	 */
	private static void elementAttributeOper(Document doc) {
		// 获取文档的根节点
		Element root = doc.getRootElement();
		// ===========================查询 begin
		// 获取节点
		Element name = root.element("name");
		// 获取某节点下的某属性
		Attribute scale = name.attribute("scale");
		// 获取属性的内容
		String scaleText = scale.getText();
		// 遍历某节点的所有属性
		for (Iterator it = root.attributeIterator(); it.hasNext();) {
			Attribute attribute = (Attribute) it.next();
		}
		// 获取某节点下所有属性
		List attributeList = name.attributes();
		// 获取某节点下某个属性的值,如果不存在该属性则返回null
		String abbrValue = name.attributeValue("abbr");
		// 获取某节点下某个属性的值,如果不存在该属性则返回设置的默认值
		String abbrnewValue = name.attributeValue("abbrnew", "IBMNEW");
		// ===========================查询 end

		// ===========================新增 begin
		// 设置某节点的属性和内容 如果不存在则新增属性
		name.addAttribute("scale", "1100");
		name.addAttribute("scalewish", "1300");
		// 设置属性的内容
		name.setText("1200");
		// ===========================新增 end

		// ===========================删除 begin
		// 删除节点属性
		boolean issuccess = name.remove(scale);
		// ===========================删除 end
	}

	/**
	 * 将document写入文件
	 *
	 * @param doc
	 * @throws IOException
	 */
	private static void writeDocumentToXml(Document doc) throws IOException {
		// 不设置编码,直接写入的形式
		// XMLWriter writer = new XMLWriter(new
		// FileWriter("source/newtest.xml"));
		// writer.write(doc);
		// writer.flush();
		// writer.close();

		// 设置编码格式写入的形式(当文档中存在中文的时候)
		// 创建文件输出的时候,紧凑的格式
		// OutputFormat format = OutputFormat.createCompactFormat();
		// 创建文件输出的时候,自动缩进的格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		// 设置编码
		format.setEncoding("UTF-8");
		// 创建XMLWriter对象,指定写出文件及编码格式
		// XMLWriter writerEncoding = new XMLWriter(new
		// FileWriter("source/newtest_encoding.xml"), format);
		XMLWriter writerEncoding = new XMLWriter(new OutputStreamWriter(
				new FileOutputStream(new File("source/newtest_encoding.xml")),
				"UTF-8"), format);
		// 写入
		writerEncoding.write(doc);
		// 立即写入
		writerEncoding.flush();
		// 关闭操作
		writerEncoding.close();
	}

	/**
	 * document的其他操作
	 *
	 * @param doc
	 * @throws DocumentException
	 */
	private static void documentOtherOper() throws DocumentException {
		// ===========================字符串与XML的转换 begin
		// 将字符串转化为XML
		String xml = "<develop><java>java 语言</java></develop>";
		Document document = DocumentHelper.parseText(xml);
		// 将文档或节点的XML转化为字符串
		SAXReader reader = new SAXReader();
		Element root = document.getRootElement();
		String docXmlText = document.asXML();
		String rootXmlText = root.asXML();
		Element memberElm = root.element("java");
		String memberXmlText = memberElm.asXML();
		// ===========================字符串与XML的转换 end
	}

}

Main.java

package com.alfred.util;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * dom4j工具类
 *
 * @author alfredinchange
 *
 */
public class Dom4jUtil {

	private static String tabchar = "  ";

	/**
	 * 获取dom4j的文档对象 总共有三种方式:读取文件,解析xml字符串,生成新的文档对象
	 *
	 * @return
	 * @throws DocumentException
	 */
	public static Document getDocument() throws DocumentException {
		// 读取XML文件,获得document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("source/test.xml"));

		// 解析XML形式的文本,得到document对象
		// String xml = "<company><name>IBM</name></company>";
		// Document doc = DocumentHelper.parseText(xml);

		// 主动创建document对象
		// Document doc = DocumentHelper.createDocument();
		// Element root = doc.addElement("company");
		// Element name = root.addElement("name");
		// name.setText("IBM");

		return doc;
	}

	/**
	 * 打印文档的结构 使用dom4j输出重定向
	 *
	 * @param doc
	 * @throws IOException
	 */
	public static void printDocumentByDom4j(Document doc) throws IOException {
		// 创建文件输出的时候,自动缩进的格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		// 设置编码
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(System.out, format);
		writer.write(doc);
		writer.flush();
		writer.close();
	}

	/**
	 * 打印文档的结构
	 *
	 * @param doc
	 *            文档对象
	 */
	public static void printDocument(Document doc) {
		Integer tabcnt = 1;

		// 获取文档对象根节点
		Element root = doc.getRootElement();
		System.out.print("<" + root.getName() + getElementAttribute(root) + ">"
				+ root.getTextTrim());
		/**
		 * root.elements():取得某节点下所有的子节点
		 * root.elements("employees"):取得某节点下所有名为"employees"的子节点
		 */
		List rootElements = root.elements();
		if (rootElements.size() != 0) {
			System.out.println();
		}
		for (Object obj : rootElements) {
			Element element = (Element) obj;
			/**
			 * element.getName():获取节点名称 element.getText():获取节点内容
			 * element.getTextTrim():获取节点内容,去掉前后空格
			 */
			System.out.print(StringUtil.copyString(tabchar, tabcnt) + "<"
					+ element.getName() + getElementAttribute(element) + ">"
					+ element.getTextTrim());
			boolean flag = printElement(element, tabcnt);
			System.out.print((flag ? StringUtil.copyString(tabchar, tabcnt)
					: "")
					+ "</" + element.getName() + ">");
			System.out.println();
		}
		System.out.print("</" + root.getName() + ">");
	}

	/**
	 * 打印节点的结构
	 *
	 * @param element
	 *            节点对象
	 * @param tabcnt
	 *            节点前的tab数目
	 */
	private static boolean printElement(Element element, Integer tabcnt) {
		tabcnt++;
		List elements = element.elements();
		if (elements.size() != 0) {
			System.out.println();
		}
		for (Object obj : elements) {
			Element el = (Element) obj;
			System.out.print(StringUtil.copyString(tabchar, tabcnt) + "<"
					+ el.getName() + getElementAttribute(el) + ">"
					+ el.getTextTrim());
			boolean flag = printElement(el, tabcnt);
			System.out.print((flag ? StringUtil.copyString(tabchar, tabcnt)
					: "")
					+ "</" + el.getName() + ">");
			System.out.println();
		}
		return elements.size() != 0;
	}

	/**
	 * 获取节点属性
	 *
	 * @param root
	 * @return
	 */
	private static String getElementAttribute(Element element) {
		StringBuffer sb = new StringBuffer();
		// 取得某节点的所有属性
		List attributes = element.attributes();
		for (Object obj : attributes) {
			Attribute attribute = (Attribute) obj;
			/**
			 * attribute.getName():获取属性名称 attribute.getText():获取属性内容
			 */
			sb.append(" " + attribute.getName() + "=\"" + attribute.getText()
					+ "\"");
		}
		return sb.toString();
	}

}

Dom4jUtil.java

package com.alfred.util;

/**
 * 字符串操作工具类
 *
 * @author alfredinchange
 *
 */
public class StringUtil {

	/**
	 * 字符串拷贝
	 * @param str 源字符串
	 * @param cnt 拷贝次数
	 * @return
	 */
	public static String copyString(String str,Integer cnt){
		StringBuffer sb = new StringBuffer();
		while(cnt != null && cnt > 0){
			sb.append(str);
			cnt--;
		}
		return sb.toString();
	}

}

StringUtil.java

<?xml version="1.0" encoding="UTF-8"?>
<company>
	<name scale="1000" abbr="ibm">IBM</name>
	<position>USA</position>
	<employees count="2">
		<employee>
			<username>alfred01</username>
			<fullname>这是测试呀</fullname>
			<age>22</age>
			<birthday>1990-10-11</birthday>
		</employee>
		<employee>
			<username>alfred02</username>
			<fullname>中文会不会出错呀</fullname>k
			<age>25</age>
			<birthday>1993-01-02</birthday>
		</employee>
	</employees>
</company>

test.xml

时间: 2024-10-13 10:36:48

Dom4j基础的相关文章

dom4j基础教程

转自 http://blog.csdn.net/whatlonelytear/article/details/42234937 Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP. DOM4J使用起来非常简单.只要你了解基本的XML-DOM模型,就能使用.然而他自己带的指南只有短短一页(html),不过说的到挺全.国内的中文资料很少. 之前看过IBM developer社区的文章(参见附录),提到一些

2016年终分析(传统开发与网络时代的Java开发)

2016重大事件:(在此将2016年的开发称为传统开发) 1.乌镇互联网大会大会(大数据&云计算) 2.某东struts2安全漏洞 3.作为一个程序呀对于淘宝双11和双12的分析应该是最好的案例 ●国家发展战略:大数据+云计算->强势兴起 产生: Java应该学什么? 全栈工程师的提出(以后的方向)? 三块技能拼接: ●传统WEB开发+大数据&云计算+互联网技术 1.如果只是会传统WEB开发,包括所谓的开发框架(SSH,SSM)都是很难稳住工作岗位的! 2.大数据&云计算:技

【XML】详解XML

目录结构: contents structure [-] 什么是XML 解析XML 解析XML的两种方式 使用dom4j解析xml dom4j的部分API 打印一个XML文件的全部内容 在dom4j中应用XPath解析XML 相关的部分API XPath的路径表达式 通配符 谓语 使用java写一个XMl文件 将一个带有书籍信息的List集合解析为XML文件 1 什么是XML XML(eXtensible  markup language) 是一种可扩展的标记语言 ,即使可以自定义标签的语言.

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

XML基础以及用DOM4j读取数据

都知道,HTML被设计用来显示数据,XML被设计用来保存.传输数据.而我们平时经常用的无非是保存数据.读取数据.所以这里主要介绍XML相关基础内容,以及用DOM4j来存取XML的数据. 下面简介XML相关的基础内容--命名空间.XSL.DTD与Schema 1>基本结构 ------------------------- ?  <>成对,区分大小写 ?  顶层元素只能有一个 ?  元素不能以xml开头,且不能有空格 2>命名空间 与我们编程语言中的命名空间类似,例如,如果想要建立两

[JavaWeb基础] 031.dom4j写入xml的方法

上一篇我们讲述了dom4j读取xml的4种方法,甚是精彩,那么怎么样写入xml呢?我们直接看下源码实现. public static void main(String[] args) throws Exception { // 创建文档 Document document = DocumentHelper.createDocument(); // 设置编码 document.setXMLEncoding("GBK"); // 创建根节点 Element root = document.

dom4j API使用简介

功能简介 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它.在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能.功能和易用性的评测,dom4j无论在那个方面都是非常出色的.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得

JavaEE开发基础

1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise Edition)和JavaME(Java Platform, Micro Edititon). JavaSE以前称为J2SE,适用于桌面系统开发,它包含了支持Java Web服务开发的类,并为JavaEE提供基础.JavaEE以前称为J2EE,适用于企业级应用开发,它是在JavaSE的基础上构建的,它

iOS面试必备-iOS基础知识

近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计 数+1,release代表引用计数-1,当引用计数减为0时