XML第二十讲:DOM4J 解析XML深入详解

  1. 对于DOM的Format类的getRawFormat方法,通常用于XML数据的网络传输,因为这种格式会去掉所有不必要的空白,因此能够减少网络传输的数据量。当然如果直接的保存在硬盘上,还是使用getPrettyFormat()方法会好一点。


  前面我讲了解析XML的第一种Java框架JDOM的使用,这一讲我们就来讲解一下另外一种解析XML的开源框架的DOM4J的使用,同样它也是为java完全支持的。

1. 下载 DOM4J 包,其官方网站(www.dom4j.org),当然你也可以google下载(点击下载dom4j),因为这个官方网址的确很难找到相关的下载链接。

2. 下载好Dom4j开发包之后,和之前JDOM类似,解压缩然后添加至Eclipse库中即可进行开发了

package com.ahuier.dom4j;

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;


public class Test1 {

	public static void main(String[] args) throws Exception {
		
/*	-----------------------------创建文档并设置文档的根元素节点:第一种方式---------------
		
		 * 在开始构建XML文档的时候,dom4j与JDOM有些差异性,dom4j是这样来构建的
		 * 它是用 DocumentHelper 类来创建的,相当于Java中的util包,都是拿来辅助创建的
		 
		
		//生成Document对象,即文档的根节点
		Document document = DocumentHelper.createDocument();
		
		
		 * 创建文档的根元素
		 * 使用Document类的setRootElement()方法来设置
		 
		Element root = DocumentHelper.createElement("student");
		document.setRootElement(root);
		
		*/
		
		
		//-----------------------------创建文档并设置文档的根元素节点:第二种方式---------------
		/*
		 * 使用DocumentHelper类的重载的createDocument()方法:
		 * public static Document createDocument(Element rootElement)
		 */
		Element root = DocumentHelper.createElement("student");
		Document document = DocumentHelper.createDocument(root);
		
		/*
		 * 往根元素上面增加属性
		 * 使用Element类的 public Element addAttribute(String name, String value)方法
		 */
		root.addAttribute("name", "zhangsan");
		
		/*
		 * 增加子元素 
		 * 在Element的父接口Branch里面的方法
		 * public Element addElement(String name)
		 */
		Element helloElement = root.addElement("hello"); //创建一个元素hello直接add到元素root下面成为它的子元素
		Element worldElement = root.addElement("world");
		
		//设置元素文本内容
		helloElement.setText("hello");
		helloElement.setText("world");
		
		//设置元素的属性
		helloElement.addAttribute("age", "20");

		
		/*
		 * 将创建好的XML的Document对象输出
		 * 使用DOM4j的XMLWriter类
		 */
		
		//使用XMLWriter类的 public void write(Document doc)方法就可以将文档输出到命令行上
		XMLWriter xmlWriter = new XMLWriter();
		xmlWriter.write(document); //输出到控制台
		
		//输出到硬盘上作为一个xml文件保存
		/*
		 * 查看XMLWriter类的构造方法,可以发现有很多重载的版本
		 * 其中第一个不带参数的构造方法就是输出到控制台上
		 */
		
		//选择 public XMLWriter(OutputFormat format)构造方法
		XMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("student2.xml"));
		xmlWriter2.write(document);
		
		//选择 XMLWriter(OutputStream out, OutputFormat format)构造方法
		//其中第二个参数表示对文档进行格式化的操作,自己查文档看使用说明
		OutputFormat format = new OutputFormat("    ", true);
		XMLWriter xmlWriter3 = new XMLWriter(new FileOutputStream("student3.xml"), format);
		xmlWriter3.write(document);
		
		//选择 XMLWriter(Writer writer, OutputFormat format) 构造方法
		/*
		 * 注意这边是使用字符流进行输出的:Writer
		 * ---------------------------------------------(1)---使用字符流进行输出
		 */
		XMLWriter xmlWriter4 = new XMLWriter(new FileWriter("student4.xml"), format);
		xmlWriter4.write(document);
		xmlWriter4.flush(); //在这个缓冲方法中这个一定要加进行刷新
	//  xmlWriter4.close(); //也可以调用这个方法,在关闭之前也会进行刷新的,注意它是在 XMLWriter 类下的
	
	}
}

[编译执行结果]:

1): 命令行输出

<?xml version="1.0" encoding="UTF-8"?>
<student name="zhangsan"><hello age="20">world</hello><world/></student>

2): 生成student2.xml

<?xml version="1.0" encoding="UTF-8"?>
<student name="zhangsan"><hello age="20">world</hello><world/></student>

3): 生成student3.xml

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

<student name="zhangsan">
    <hello age="20">world</hello>
    <world/>
</student>

4): 生成student4.xml

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

<student name="zhangsan">
    <hello age="20">world</hello>
    <world/>
</student>

[说明]:在上诉代码段1中,如果调用flush()方法的话,生成的student4.xml是一份空的文档,原因可以参考dom4j文档中的XMLWriter类的write()方法的说明,如下所示:


public void write(Document doc) throws IOException

  This will print the Document to the current Writer.
  Warning: using your own Writer may cause the writer's preferred character encoding to be ignored. If you use encodings other than UTF8, we recommend using the method that takes an OutputStream instead.
  Note: as with all Writers, you may need to flush() yours after this method returns.

【总结】:在运用JDK或者第三方开源包的时候碰到问题,要学会查找它们的文档来进行解决,而不是马上去google一下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值