`
xiaoxin5230
  • 浏览: 88734 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

xml之dom4j

    博客分类:
  • j2ee
阅读更多
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");

	

	}
}
  • xml.rar (908.1 KB)
  • 下载次数: 58
分享到:
评论

相关推荐

    Dom4J生成XML的完整方法希望大家能用到

    ### Dom4J生成XML的完整方法详解 在Java开发领域,处理XML文档是常见的需求之一。Dom4J作为一款优秀的Java XML API,以其简洁、高效的特点,在生成、解析和操作XML文档方面表现突出。本文将深入探讨如何使用Dom4J库...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    在项目中使用DOM4J时,只需将相应的jar包(如dom4j-1.6.1.jar、dom4j-2.0.2.jar或dom4j-2.1.1.jar)导入到类路径中,即可开始利用其功能处理XML文档。导入后,可以按照DOM4J提供的API进行编程,快速实现XML的读写...

    dom4j解析xml详解

    DOM4J的核心优势之一在于其丰富的接口体系,这些接口定义在`org.dom4j`包内,提供了对XML文档进行读写、查询、修改等操作的能力。 1. **Attribute**: 代表XML中的属性,可用于获取和设置属性值。 2. **Branch**: ...

    xmldom4j解析

    四、DOM4J处理循环节点 在处理包含循环节点的XML时,可以使用迭代器或XPath查询来遍历这些节点。例如,遍历所有`&lt;item&gt;`元素: ```java Element root = document.getRootElement(); List&lt;Element&gt; items = root....

    DOM4j操作xml文件

    DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件DOM4j操作xml文件

    dom4j 解析(读取) xml 节点数据

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的方式来解析、创建、修改和操作XML数据。在本教程中,我们将深入探讨如何使用DOM4J解析(读取)XML节点数据,不受XML层级的限制。 首先,确保你...

    XSD使用dom4j校验XML

    DOM4J是Java环境中一个强大、灵活的XML处理库,它提供了XML的读取、写入、解析和操作的能力。本篇文章将深入探讨如何利用DOM4J库来实现XSD对XML文档的校验,以确保XML文件符合预先设定的数据结构规则。 首先,理解...

    dom4j.jar,dom,xml,dom4j

    总之,DOM4J是Java开发中处理XML文档的首选库之一,它提供了一套全面的API,包括解析、操作和查询XML的功能,且性能高效,易于使用。无论你是新手还是经验丰富的开发者,DOM4J都能帮助你更便捷地与XML数据交互。

    java解析XML dom4j dom4j-1.6.1.jar

    Java解析XML时,dom4j是一个非常流行的库,它提供了灵活且强大的API来处理XML文档。dom4j-1.6.1.jar是这个库的一个版本,发布于2005年,它支持XML的读取、写入、操作以及查询功能。在本文中,我们将深入探讨dom4j的...

    使用Maven管理项目,实现DOM4j操作XML文件

    DOM4j则是一个强大的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、修改等操作。在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是...

    dom4j 读取带有命名空间的xml文件

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了丰富的API,使得解析、创建、操作XML变得简单。在处理带有命名空间的XML文件时,DOM4J库显得尤为重要,因为XML命名空间是XML规范中一个关键的概念,用于避免...

    xml&dom&sax&dom4j 代码编写和总结

    对于xml&dom&sax&dom4j 文件解析的代码总结

    dom4j解析xml文件的压缩包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、查询和修改变得简单。这个压缩包包含了DOM4J的完整版本,适用于那些希望在Java项目中使用DOM4J进行XML操作的开发者...

    dom4j读写xml文档实例

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单且高效的API来读取、写入、修改以及操作XML。在这个实例中,我们将深入理解DOM4J库如何帮助我们处理XML文档,并通过实际操作来熟悉其核心功能。 XML...

    使用dom4j和jaxen解析xml

    **dom4j** 是一个非常灵活且功能强大的Java XML API,它提供了全面的XML解决方案,包括XML的读取、写入、修改以及XPath查询等功能。dom4j的核心思想是基于DOM模型,但比DOM更轻量级,性能更好。它支持事件驱动和SAX...

    dom4j解析xml

    #### 四、XPath表达式在DOM4J中的应用 DOM4J支持XPath表达式来查询XML文档中的节点,XPath表达式是查询XML文档的一种强大工具,能够精确地定位到文档中的任意节点。 - **基本的XPath表达式**: - `/AAA/BBB/CCC`...

    java操作xml dom dom4j sax jdom

    为了处理XML文档,Java提供了多种API,其中最常用的包括DOM、SAX、DOM4J和JDOM。以下是对这些方法的详细介绍: 1. DOM(Document Object Model) DOM是一种树形结构的API,它将整个XML文档加载到内存中,形成一个...

    解析xml文件dom4j

    DOM4J是Java中解析和操作XML文档的一个强大库,提供了灵活且高效的API。本资源包含了DOM4J的两个版本:1.6.1和2.0.3,以供不同需求的选择。 DOM4J 1.6.1是较早的一个版本,适用于那些需要兼容旧项目或系统的开发者...

Global site tag (gtag.js) - Google Analytics