dom4j的使用及常见问题

相信作为一个开发人员应该对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/

二.将下载的压缩包解压。会看到(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/

时间: 2024-08-09 10:54:39

dom4j的使用及常见问题的相关文章

Struts+Hibernate+Spring常见问题

http://wanglihu.iteye.com/blog/1897718 1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor缺少asm-3.3.jar2.java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor缺少asm-commons-3.3.jar3.java.lang.ClassNotFoundException: org.s

weblogic常见问题转

转自:http://wenku.baidu.com/link?url=lRRp2-pF2CHoSxff7ynqDKWpk9aJ7sHoOWm78_74_mSOiqC-qJMn3kAlJRqv2WnYSktzjpQF951Hf0k7kwwZMwAewKglR0sggYsLZOCdBHG myeclipse+weblogic10的配置,配置成功 运行中可能失败,由于weblogic10不稳定,重启机器后可以使用了 web工程使用到hibernate3时可能出现问题 ClassNotFoundExce

Dom4j读写文件时的编码问题

1.Dom4j写文件时的编码问题 如上图代码所示,如果使用 writer = new XMLWriter(new FileWriter(new File(filepath)), xmlFormat); 下载的xml文件编码格式如下: 原因分析: 由于FileWriter默认的输出编码是ANSI编码,而Dom4j中的wirte方法提供的内容实际是以UTF-8保存的,因此会造成包括中文字符的XML文件无法正常阅读. 解决方法: 不能使用简单的FileWriter,而应该是使用一个能指定具体输出编码的

PHP常见问题及解答

当作PHP学习时,总是会在baidu上查很多的例如开发环境的选择呀,PHP好不好呀!或者是不是转学JAVA,或是.NET等: 首先本人是从2010年下半年开始报名学的PHP(IN Guangzhou),每周一天学了近6个月左右,从最基础的HTML,CSS,DIV,JAVASCRIPT,AJAX,PHP,然后学二次开发:闲暇之余还开通了一个个人blog( PHP wordpress); 由于个人工作原因,这几年放了一段时间未动PHP了,今年开始又自学了.NET; ---目的就想业余做一份兼职,锻炼

微信JS-SDK说明文档及常见问题处理

概述 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 此文档面向网页开发者介绍微信JS-SDK如何使用及相关注意事项. 使用说明 在使用微信JS-SDK对应的JS接口前,需确保公众号已获得使用对应JS接口的权限,可登录微信公众平台进入“开发者中心”查看对应的接口权限. 注意:

【dom4j】解析xml为map

dom4j解析xml文件 <?xml version="1.0" encoding="utf-8"?> <workflows> <queryRequest> <branchId>88037062</branchId> <merSysId>00000317</merSysId> <queryNo>948983692</queryNo> <billType&

NHibernate常见问题及解决方法

NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end-of-text> (possibly an invalid or unmapped class name was used in the query)."错误查了好半天终于查到了.这篇文章是我转载的NHibernate的常见错误... hbm.xmlNHibernate文件中版本号可能引起的

NTB调试常见问题指南

作为实现不同PCI域乃至跨节点数据传输的重要器件,NTB在服务器和存储领域实现双控.内存互访等方面发挥着重要的作用.由于它本身既作为virtual port出现,又可以被互联的结点通过pci scan看到,作为一个link port出现,加之其上实现的地址转换和转发功能,在实际工程项目中,难免会碰到各种问题.本文结合笔者最近的工作,分享了NTB调试过程中常见的问题和解决思路和办法. 从问题的现象来看,具体常见问题包括: 找不到NTB设备: NTB mailbox无法传送数据: ReqID 无法探

SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结

一 开发环境 1.动态web工程 2.部分依赖 java代码: hibernate-release-4.1.0.Final.zip hibernate-validator-4.2.0.Final.jar spring-framework-3.1.1.RELEASE-with-docs.zip proxool-0.9.1.jar log4j 1.2.16 slf4j -1.6.1 mysql-connector-java-5.1.10.jar hamcrest 1.3.0RC2 ehcache 2