欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dom4j 使用及常见问题 博客分类: java dom4jxml 

程序员文章站 2024-02-21 15:59:52
...

相信作为一个开发人员应该对XML与JSON 非常熟悉。关于两者的介绍与区别网上已经有很多资料,java对于XML的解析也有很多工具包,主要解析的方式有三种:

1.DOM解析方式:适用于解析小型XML文件,如果操作大型XML文件,将整个Docment读入内存可能会引起内存不足。

2.SAX解析方式:对内存占用较小,适合解析大型XML文件,说白了就是扫描解析。

3.Digester/JAXB: Struts 的 XML 解析工具 Digester。

 

本文主要介绍dom4j的使用,dom4j中已经整合了SAX方式。使用dom4j可以应对大型XML文件的操作。对于Digester笔者没有过多的接触,这里就不做过多的说明。

下面来看dom4j的使用。

 

一.登录官网http://www.dom4j.org/

如果找不到下载位置可以去github下载 (http://dom4j.github.io/

笔者使用的是1.6版本(最新版本截至发稿已更新至2.0)

 

二.将下载的压缩包解压。会看到(dom4j-1.6.1.jar)包,将jar包导入工程便可。

 

三.简单的读写操作,以下是操作代码:

public class XMLTest {
	String fileName = "d:/test/test.xml";
	@Test
	public void testWriteXML(){
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();//创建格式化类
			format.setEncoding("UTF-8");//设置编码
			format.setIndent(true);//是否缩进
			format.setNewlines(true);//是否换行
			XMLWriter xmlWriter = new XMLWriter(new FileWriter(fileName), format);
			//如果需要设置文件编码格式,则需要使用一下方式创建writer   (1)
			//xmlWriter = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)), "UTF-8"), format);
			Document document = DocumentHelper.createDocument();//通过DocumentHelper工具类创建document
			Element root = document.addElement("root");
			root.addElement("item").addAttribute("type", "t").addText("text");
			xmlWriter.write(document);
			xmlWriter.close();//一定要关闭 (2)
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
//	@Test
	public void testReadXML(){//将XML文件一次性读取
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(new FileReader(fileName));
			Element root = document.getRootElement();
			for(Iterator<?> i = root.elementIterator(); i.hasNext();){//遍历节点
				Element ele = (Element) i.next();
				System.out.println(ele.asXML());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

        @Test
	public void testWriteXML1(){//写入较大XML文件时,建议使用以下方式
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("UTF-8");//设置编码
			format.setIndent(true);//是否缩进
			format.setNewlines(true);//是否换行
			XMLWriter xmlWriter = new XMLWriter(new FileWriter(fileName), format);
			Document document = DocumentHelper.createDocument();//通过DocumentHelper工具类创建document
			xmlWriter.write(document);
			Element root = document.addElement("root");
			Element item = DocumentHelper.createElement("item");
			xmlWriter.writeOpen(root);//准备写入
			for(int i=0;i<1000000;i++){
				item.addAttribute("type", "type"+i).addText("text"+i);
				item.setParent(root);
				xmlWriter.write(item);//写入节点
				item.clearContent();//清空节点属性
			}
			xmlWriter.writeClose(root);//写入完成
			xmlWriter.close();//一定要关闭
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	@Test
	public void testSAXReader(){//扫描方式读取XML文件,需要实现ElementPath 接口,在该接口中进行逻辑处理
		SAXReader reader = new SAXReader();
		reader.setDefaultHandler(new ElementHandler() {
			@Override
			public void onStart(ElementPath elementPath) {
				Element element = elementPath.getCurrent();
				if("item".equals(element.getName())){
					System.out.println(element.attributeValue("type"));
					System.out.println(element.getText());//没有获取Text值(3)
				}
			}
			
			@Override
			public void onEnd(ElementPath elementPath) {
				Element element = elementPath.getCurrent();
				if("item".equals(element.getName())){
					System.out.println(element.attributeValue("type"));
					System.out.println(element.getText());
				}
			}
		});
		try {
			reader.read(new FileReader(fileName));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

 四:注意事项:

(1):生成XML文件编码,如果有中文需要注意此处配置。

(2):一定记得关闭write。

(3):ElementHandler接口,需要实现onStart(初始化操作),onEnd方法(处理逻辑),这里注意在onStart方法中将无法获得节点的Text值(可能是没有读完操作)。

 

注明:如果需要更详细的介绍,请参考官方文档

参考:http://www.ibm.com/developerworks/cn/xml/dm-1208gub/

 

相关标签: dom4j xml