相信做为一个开发人员应该对XML与JSON 很是熟悉。关于二者的介绍与区别网上已经有不少资料,java对于XML的解析也有不少工具包,主要解析的方式有三种:java
1.DOM解析方式:适用于解析小型XML文件,若是操做大型XML文件,将整个Docment读入内存可能会引发内存不足。git
2.SAX解析方式:对内存占用较小,适合解析大型XML文件,说白了就是扫描解析。github
3.Digester/JAXB: Struts 的 XML 解析工具 Digester。dom
本文主要介绍dom4j的使用,dom4j中已经整合了SAX方式。使用dom4j能够应对大型XML文件的操做。对于Digester笔者没有过多的接触,这里就不作过多的说明。ide
下面来看dom4j的使用。工具
一.登陆官网http://www.dom4j.org/编码
若是找不到下载位置能够去github下载 (http://dom4j.github.io/)code
二.将下载的压缩包解压。会看到(dom4j-1.6.1.jar)包,将jar包导入工程即可。orm
三.简单的读写操做,如下是操做代码:xml
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值(多是没有读完操做)。
注明:若是须要更详细的介绍,请参考官方文档