Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南只有短短一页(html),不过说的到挺全。
IBM developer社区的文章,提到一些XML解析包的性能比较,其中DOM4J的性能非常出色,在多项测试中名列前茅。(事实上DOM4J的官方文档中也引用了这个比较)
如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。
package com.xyj.com.tool.xml;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* @className:Dom4jUtil.java
* @classDescription:dom4j操作类
* @author:xiayingjie
* @createTime:2010-10-26
*/
public class Dom4jUtil {
// -----------------写------------------------------
/**
* 将doc转换成String(默认为不换行,utf-8编码)
*
* @param doc
* Document对象
* @return String
*/
public static String docToString(Document doc) {
return docToString(doc,false,"UTF-8");
}
/**
* 将doc转换成String(默认是UTF-8编码)
*
* @param doc
* Document对象
* @param newLine
* 是否换行
* @return String
*/
public static String docToString(Document doc,boolean newLine){
return docToString(doc,newLine,"UTF-8");
}
/**
* 将doc转换成String(默认不换行)
*
* @param doc
* Document对象
* @param encoding
* 字符编码
* @return String
*/
public static String docToString(Document doc,String encoding){
return docToString(doc,false,encoding);
}
/**
* 将doc转换成String
*
* @param doc Document对象
* @param newLine 是否换行
* @param encoding 字符编码
* @return String
*/
public static String docToString(Document doc,boolean newLine,String encoding){
String str = "";
try {
// 使用输出流来进行转化
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 使用UTF-8编码--false 换行
OutputFormat format = new OutputFormat("", newLine, encoding);
XMLWriter writer = new XMLWriter(out, format);
writer.write(doc);
str = out.toString(encoding);
} catch (Exception ex) {
ex.printStackTrace();
}
return str;
}
/**
* 将xml格式的字符串转换成Document对象
*
* @param str
* xml格式字符串(字符串编码必须为utf-8,否则会出现乱码)
* @return Document对象
*/
public static Document stringToDoc(String str) {
Document doc = null;
try {
// 将xml格式化字符串转成Document对象
doc = DocumentHelper.parseText(str);
} catch (Exception ex) {
ex.printStackTrace();
}
return doc;
}
/**
* 将xml字符串保存为xml文件
*
* @param xmlStr
* xml格式的字符串
* @param fileName
* 保存的文件名
* @return true:保存成功 flase:失败
*/
public static boolean stringToXmlFile(String xmlStr, String fileName) {
boolean flag = true;
try {
flag = docToXmlFile(stringToDoc(xmlStr), fileName);
} catch (Exception ex) {
flag = false;
ex.printStackTrace();
}
return flag;
}
/**
* 将doc写入xml文件(默认为Utf-8编码)
*
* @param doc document对象
* @param fileName 文件的全路径
* @return
*/
public static boolean docToXmlFile(Document doc, String fileName){
return docToXmlFile(doc,fileName,"UTF-8");
}
/**
* 将doc写入xml文件
*
* @param doc document对象
* @param fileName 文件的全路径
* @param encoding 编码
* @return
*/
public static boolean docToXmlFile(Document doc, String fileName,String encoding) {
boolean flag = true;
try {
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式
format.setEncoding(encoding);
// 创建输出流
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream(fileName), encoding);
FileWriter fw = new FileWriter(new File(fileName));
// 创建xml输出流
XMLWriter writer = new XMLWriter(osw, format);
// 生成xml文件
writer.write(doc);
writer.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
/**
* 创建document
*
* @return Document
*/
public static Document createDocument() {
// 创建文档
return DocumentHelper.createDocument();
}
//---------------------------读(sax)---------------------
/**
* 使用sax加载xml文档(速度快-大文件)
* @param filename 绝对文件路径
* @return 成功返回Document对象,失败返回null
*/
public static Document loadForSax(String filename) {
Document document = null;
try {
SAXReader saxReader = new SAXReader();
document = saxReader.read(new File(filename));
} catch (Exception ex) {
ex.printStackTrace();
}
return document;
}
//---------------------读(dom)--------------------
/**
* 使用dom加载xml(速度快-小文件 适用于频繁操作xml)
* @param fileName
* @return
*/
public static Document loadForDom(String fileName){
Document doc=null;
try{
//创建DoucmentBuilder工厂类(使用jaxp解析)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
db = dbf.newDocumentBuilder();
//读取doc(首先将其转换成w3c的Document,然后在转成Dom4j的Document)
org.w3c.dom.Document domDocument = db.parse(new File(fileName));
DOMReader reader = new DOMReader();
doc = reader.read(domDocument);
}catch(Exception e){
e.printStackTrace();
}
return doc;
}
/**-------------------xpath查询语法------------
bookstore 选取 bookstore 元素的所有子节点
/bookstore 选取根元素 bookstore 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取所有名为 lang 的属性。
/bookstore[@lang='我和你'] 选取bookstore lang属性等于'你和我'的所有元素
/bookstore[@lang>2] 选取bookstore lang属性大于2的所有元素 如果不加@,那么就是元素比较
/bookstore/book[price>35.00]/title
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素。
“|”表示或
*/
/**
* 根据xpath语法查询匹配的结果集(Element或者Attribute)
* @param doc Document对象
* @param xpathExp xpath查询语法,官方推荐
* @return List
*/
public static List findList(Document doc,String xpathExp){
return doc.selectNodes(xpathExp);
}
// /**
// * 查询结果
// * @param doc
// * @param xpathExp
// * @return
// */
// public static Node findSingleNode(Document doc,String xpathExp){
// return doc.selectSingleNode(xpathExp);
// }
// /**
// * 根据xpath语法查询匹配的结果集(Element或者Attribute)
// * @param Element Element对象
// * @param xpathExp xpath查询语法,官方推荐
// * @return List
// */
// public static List findList(Element el,String xpathExp){
// return el.selectNodes(xpathExp);
// }
public static void main(String[] args) {
Document doc =Dom4jUtil.loadForDom("D://b.xml");
List list=Dom4jUtil.findList(doc,"//skills/skill/@name");
for (Iterator it = list.iterator(); it.hasNext();) {
Attribute attr = (Attribute) it.next();
Element el = (Element) it.next();
System.out.println(attr.getValue());
//TODO
}
//--------增删改查都放到具体的操作中。
// String str = "<skills><!--第一个技能--><skill name=\"独孤九剑\">"
// + "<info>为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info> </skill>"
// +
// "<skill name='葵花宝典'> <info>宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。</info>"
// +
// " </skill> <skill name='北冥神功'> <info>나는 당신을 사랑합니다 一,能吸人内力转化为自己所有,威力无穷。</info>"
// + " </skill></skills>";
//
// System.out.println(docToString(stringToDoc(str)));
// Document doc = Dom4jUtil.createDocument();
// Element e = doc.addElement("skills");
//
// Element e1 = e.addElement("skill");
// e1.addComment("第一个技能");
// e1.addAttribute("name", "独孤九剑");
// e1.addElement("info").addText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲");
//
// Element e2 = e.addElement("skill");
// e2.addComment("第二个技能");
// e2.addAttribute("name", "葵花宝典");
// e2.addElement("info").addText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");
//
// Dom4jUtil.docToXmlFile(doc, "D://b.xml");
}
}
分享到:
相关推荐
### Dom4J生成XML的完整方法详解 在Java开发领域,处理XML文档是常见的需求之一。Dom4J作为一款优秀的Java XML API,以其简洁、高效的特点,在生成、解析和操作XML文档方面表现突出。本文将深入探讨如何使用Dom4J库...
在项目中使用DOM4J时,只需将相应的jar包(如dom4j-1.6.1.jar、dom4j-2.0.2.jar或dom4j-2.1.1.jar)导入到类路径中,即可开始利用其功能处理XML文档。导入后,可以按照DOM4J提供的API进行编程,快速实现XML的读写...
DOM4J的核心优势之一在于其丰富的接口体系,这些接口定义在`org.dom4j`包内,提供了对XML文档进行读写、查询、修改等操作的能力。 1. **Attribute**: 代表XML中的属性,可用于获取和设置属性值。 2. **Branch**: ...
四、DOM4J处理循环节点 在处理包含循环节点的XML时,可以使用迭代器或XPath查询来遍历这些节点。例如,遍历所有`<item>`元素: ```java Element root = document.getRootElement(); List<Element> items = root....
DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的方式来解析、创建、修改和操作XML数据。在本教程中,我们将深入探讨如何使用DOM4J解析(读取)XML节点数据,不受XML层级的限制。 首先,确保你...
DOM4J是Java环境中一个强大、灵活的XML处理库,它提供了XML的读取、写入、解析和操作的能力。本篇文章将深入探讨如何利用DOM4J库来实现XSD对XML文档的校验,以确保XML文件符合预先设定的数据结构规则。 首先,理解...
总之,DOM4J是Java开发中处理XML文档的首选库之一,它提供了一套全面的API,包括解析、操作和查询XML的功能,且性能高效,易于使用。无论你是新手还是经验丰富的开发者,DOM4J都能帮助你更便捷地与XML数据交互。
Java解析XML时,dom4j是一个非常流行的库,它提供了灵活且强大的API来处理XML文档。dom4j-1.6.1.jar是这个库的一个版本,发布于2005年,它支持XML的读取、写入、操作以及查询功能。在本文中,我们将深入探讨dom4j的...
DOM4j则是一个强大的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、修改等操作。在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了丰富的API,使得解析、创建、操作XML变得简单。在处理带有命名空间的XML文件时,DOM4J库显得尤为重要,因为XML命名空间是XML规范中一个关键的概念,用于避免...
对于xml&dom&sax&dom4j 文件解析的代码总结
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、查询和修改变得简单。这个压缩包包含了DOM4J的完整版本,适用于那些希望在Java项目中使用DOM4J进行XML操作的开发者...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单且高效的API来读取、写入、修改以及操作XML。在这个实例中,我们将深入理解DOM4J库如何帮助我们处理XML文档,并通过实际操作来熟悉其核心功能。 XML...
**dom4j** 是一个非常灵活且功能强大的Java XML API,它提供了全面的XML解决方案,包括XML的读取、写入、修改以及XPath查询等功能。dom4j的核心思想是基于DOM模型,但比DOM更轻量级,性能更好。它支持事件驱动和SAX...
#### 四、XPath表达式在DOM4J中的应用 DOM4J支持XPath表达式来查询XML文档中的节点,XPath表达式是查询XML文档的一种强大工具,能够精确地定位到文档中的任意节点。 - **基本的XPath表达式**: - `/AAA/BBB/CCC`...
为了处理XML文档,Java提供了多种API,其中最常用的包括DOM、SAX、DOM4J和JDOM。以下是对这些方法的详细介绍: 1. DOM(Document Object Model) DOM是一种树形结构的API,它将整个XML文档加载到内存中,形成一个...
DOM4J是Java中解析和操作XML文档的一个强大库,提供了灵活且高效的API。本资源包含了DOM4J的两个版本:1.6.1和2.0.3,以供不同需求的选择。 DOM4J 1.6.1是较早的一个版本,适用于那些需要兼容旧项目或系统的开发者...