- 浏览: 2150754 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sunzeshan:
找了很久,用了这个插件解决问题啦。谢谢
eclipse jetty debug source not found -
xiaosong0112:
您好,请问为什么要这样设置呢,原理是什么?在网上很多转帖都没有 ...
maven的jetty插件提示No Transaction manager found导致启动慢的解决方法 -
eimhee:
tjzx 写道畅搜谷歌:http://dian168.cc/打 ...
Google 镜像站搜集 -
tjzx:
畅搜谷歌:http://dian168.cc/打开的是“最火源 ...
Google 镜像站搜集 -
eimhee:
finallygo 写道你这属于"头痛医头脚痛医脚& ...
解决linux下too many file问题
英文原文 : http://dom4j.sourceforge.net/dom4j-1.6.1/faq.html#large-doc
dom4j提供了基于事件的模型来操作xml文档。利用该模型开发人员可以一部分、一部分的处理XML文档,而不需要将整个XML文档都加载到内存中。例如:假想你要处理一个非常大的XML文档,它可能是由数据库的某张数据表而来的。如下所示:
<ROWSET>
<ROW ID="1">
...
</ROW>
<ROW ID="2">
...
</ROW>
...
<ROW ID="N">
...
</ROW>
</ROWSET>
我们可以在某一时间只处理一个ROW节点,而不必立刻将文档的所有内容加载到内存中。dom4j提供一个基于事件的模型来实现它。我们可以注册一个事件处理器来处理一个或多个路径表达式。事件处理器会在注册路径的开始和结束时被调用执行。当注册路径的开始标签找到时执行事件处理器的 onStart()方法,当注册路径的结束标签被找到时执行事件处理器的onEnd()方法。
onStart()和onEnd()方法传递一个ElementPath实例参数,这个实例既为根据注册路径遍历xml文档时的当前节点(Element)。如果想对遍历的当前节点进行操作,可以在onEnd()方法中对当前节点调用detach()方法保存改。
下面是示例代码:
上面的办法解决了读的问题可是写的问题还没有解决。我命由我不由天(吹牛皮),畅游dom4j的doc文档找到如下几个方法
startDocument()
writeOpen();
writeClose();
endDocument()
动手一试,问题搞定,看来牛皮没白吹。下面是示例代码:
新问题出现。对于读取数据的方法,在onEnd()方法中只是进行对Element的简单操作而已,若要对Element进行复杂的处理怎么办,如将 Element节点的数据写入数据库,无法在onEnd()方法中加入过多的代码,因为无法通过编译。仔细想了一下dom4j的注册事件处理器应该用的是模板方法,通过钩子将用户的操作加入到模板中去。何不自己写一个事件处理器来完成我们自己的定制操作,代码如下:
下面给出完整的实例代码。该实例首先创建一个xml文档,然后读取xml文档中的数据并将数据写入Access数据库中。测试时使用的文件大小为125M未发生内存溢出。
dom4j提供了基于事件的模型来操作xml文档。利用该模型开发人员可以一部分、一部分的处理XML文档,而不需要将整个XML文档都加载到内存中。例如:假想你要处理一个非常大的XML文档,它可能是由数据库的某张数据表而来的。如下所示:
<ROWSET>
<ROW ID="1">
...
</ROW>
<ROW ID="2">
...
</ROW>
...
<ROW ID="N">
...
</ROW>
</ROWSET>
我们可以在某一时间只处理一个ROW节点,而不必立刻将文档的所有内容加载到内存中。dom4j提供一个基于事件的模型来实现它。我们可以注册一个事件处理器来处理一个或多个路径表达式。事件处理器会在注册路径的开始和结束时被调用执行。当注册路径的开始标签找到时执行事件处理器的 onStart()方法,当注册路径的结束标签被找到时执行事件处理器的onEnd()方法。
onStart()和onEnd()方法传递一个ElementPath实例参数,这个实例既为根据注册路径遍历xml文档时的当前节点(Element)。如果想对遍历的当前节点进行操作,可以在onEnd()方法中对当前节点调用detach()方法保存改。
下面是示例代码:
SAXReader reader = new SAXReader(); reader.addHandler( "/ROWSET/ROW", new ElementHandler() { public void onStart(ElementPath path) { // do nothing here... } public void onEnd(ElementPath path) { // process a ROW element Element row = path.getCurrent(); Element rowSet = row.getParent(); Document document = row.getDocument(); ... // prune the tree row.detach(); } } ); Document document = reader.read(url);
上面的办法解决了读的问题可是写的问题还没有解决。我命由我不由天(吹牛皮),畅游dom4j的doc文档找到如下几个方法
startDocument()
writeOpen();
writeClose();
endDocument()
动手一试,问题搞定,看来牛皮没白吹。下面是示例代码:
/** * 数据写入xml文件 * @param filePath 目标xml文件的存放路径 * @return */ public boolean writeXML(String filePath){ XMLWriter out; try { /* * 创建XMLWriter对象,设置XML编码,解决中文问题。 */ OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("GBK"); out = new XMLWriter(new FileWriter(filePath),outputFormat); out.startDocument(); Element rootElement = DocumentHelper.createElement("mans"); out.writeOpen(rootElement); /* * 向mans节点写入子节点 */ for(int i=0 ; i<1000000 ; i++){ Element man = createManElement(new Long(i), "shuhang"+i);//用于创建节点的方法 out.write(man); System.out.println(" the loop index is : " + i); } out.writeClose(rootElement); out.endDocument(); out.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } catch (SAXException e) { e.printStackTrace(); return false; } }
新问题出现。对于读取数据的方法,在onEnd()方法中只是进行对Element的简单操作而已,若要对Element进行复杂的处理怎么办,如将 Element节点的数据写入数据库,无法在onEnd()方法中加入过多的代码,因为无法通过编译。仔细想了一下dom4j的注册事件处理器应该用的是模板方法,通过钩子将用户的操作加入到模板中去。何不自己写一个事件处理器来完成我们自己的定制操作,代码如下:
public class ManElementHandler implements ElementHandler { public String mdbName; public ManElementHandler(){ } public ManElementHandler(String mdbName){ this.mdbName = mdbName; } public boolean saveMan(Element element, String mdbName){ return true; } public void onEnd(ElementPath arg0) { Element row = arg0.getCurrent(); Element rowSet = row.getParent(); Document document = row.getDocument(); Element root = document.getRootElement(); Iterator it = root.elementIterator(); while(it.hasNext()){ Element element = (Element)it.next(); System.out.println(" id : " + element.elementText("id") + " name : " + element.elementText("name")); saveMan(element, this.mdbName); } row.detach(); } public void onStart(ElementPath path) { } }
下面给出完整的实例代码。该实例首先创建一个xml文档,然后读取xml文档中的数据并将数据写入Access数据库中。测试时使用的文件大小为125M未发生内存溢出。
//***************************************************************************************************************** package com; import java.sql.Connection; import java.sql.DriverManager; /** * 获取Access数据库的连接 * @author 佛山无影脚 * @version 1.0 * Jul 7, 2008 4:35:49 PM */ public class AccessMDBUtil { public static Connection connectMdb(String mdbName) { if(mdbName == null || mdbName.equals("")){ return null; } try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String dburl ="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+mdbName; Connection conn=DriverManager.getConnection(dburl); return conn; } catch (Exception e) { e.printStackTrace(); return null; } } } //******************************************************************************************************************* //******************************************************************************************************************* package com; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.ElementHandler; import org.dom4j.ElementPath; /** * 定制的事件处理器 * @author 佛山无影脚 * @version 1.0 * Jul 7, 2008 4:35:49 PM */ public class ManElementHandler implements ElementHandler { public String mdbName;//数据库名称 含路径 public ManElementHandler(){ } public ManElementHandler(String mdbName){ this.mdbName = mdbName; } /** *将Element节点数据保存到数据库 *@param element 遍历XML文档时的当前节点 *@param mdbName 数据库名称 含路径 *@return */ public boolean saveMan(Element element, String mdbName){ System.out.println(" the method saveMan in ManElementHandler is execute!"); Statement stmt = null; ResultSet rs = null; Connection conn = null; try { conn= AccessMDBUtil.connectMdb(mdbName); stmt=conn.createStatement(); String sql = "insert into mans(id,name) values(" + element.elementText("id") + ",'" + element.elementText("name") + "')"; stmt.executeUpdate(sql); } catch (Exception e) { e.printStackTrace(); return false; } finally { if(rs != null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stmt != null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return true; } public void onEnd(ElementPath arg0) { Element row = arg0.getCurrent(); Element rowSet = row.getParent(); Document document = row.getDocument(); Element root = document.getRootElement(); Iterator it = root.elementIterator(); while(it.hasNext()){ Element element = (Element)it.next(); System.out.println(" id : " + element.elementText("id") + " name : " + element.elementText("name")); saveMan(element, this.mdbName); } row.detach(); } public void onStart(ElementPath path) { } } //************************************************************************************************************************* //************************************************************************************************************************* package com; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; /** * 测试 * @author 佛山无影脚 * @version 1.0 * Jul 7, 2008 4:35:49 PM */ public class ManTest { /** * 创建man节点 * <man><id>1</id><name>佛山无影脚</name></man> * @param id * @param name * @return */ public Element createManElement(Long id,String name){ Element manElement = DocumentHelper.createElement("man"); manElement.addElement("id").addText(id.toString()); manElement.addElement("name").addText(name); return manElement; } /** * 数据写入xml文件 * @param filePath 目标xml文件的存放路径 * @return */ public boolean writeXML(String filePath){ XMLWriter out; try { /* * 创建XMLWriter对象,设置XML编码,解决中文问题。 */ OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("GBK"); out = new XMLWriter(new FileWriter(filePath),outputFormat); out.startDocument(); Element rootElement = DocumentHelper.createElement("mans"); out.writeOpen(rootElement); /* * 向mans节点写入子节点 */ for(int i=0 ; i<1000000 ; i++){ Element man = this.createManElement(new Long(i), "shuhang"+i); out.write(man); System.out.println(" the loop index is : " + i); } out.writeClose(rootElement); out.endDocument(); out.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } catch (SAXException e) { e.printStackTrace(); return false; } } /** * 从xml文件中读取数据,并将数据写入Access数据 * @param filePath xml文件的存放路径 * @return */ public boolean readXML(String filePath){ ManElementHandler manElementHandler = new ManElementHandler("F:\\dom4j\\xmlTest.mdb"); SAXReader reader = new SAXReader(); reader.addHandler( "/mans/man", manElementHandler); Document document = null; try { File file = new File(filePath); document = reader.read(file); } catch (DocumentException e) { e.printStackTrace(); return false; } return true; } public static void main(String[] args){ XMLReader reader = null; long startTime = System.currentTimeMillis(); ManTest mantest = new ManTest(); mantest.writeXML("f:\\dom4j\\mans.xml"); mantest.readXML("f:\\dom4j\\mans.xml"); long endTime = System.currentTimeMillis(); System.out.println(" is end! the millis is : " + (endTime - startTime)); } }
发表评论
-
MySQLNonTransientConnectionException: No operations allowed
2015-05-19 16:47 2313最近在调试会发现“ No operations allow ... -
mysql 执行计划优化
2013-04-07 17:46 1530一条简单的SQL 语句竟花了15.87 sec, ... -
ThreadLocal 引起的内存泄露
2012-10-18 17:48 2405最近在用LOADRUNNER做性能测试, 运行几个小时后, ... -
lucene 反向索引原理
2012-07-20 12:47 1985lucene是一个高性能的全文搜索工具, 使用反向索引结构。 ... -
tomcat7在UBUNTU上自动启动
2012-06-11 12:55 2754为了让tomcat自动启动当电脑重起时, 你必须添加一个脚本, ... -
hadoop中的Writable分析
2012-06-07 11:27 3362hadoop 要使一个类能序例化, 要实现Writabl ... -
在UBUNTU安装NUTCH(十个简单的步骤)
2012-06-06 17:32 4001下面十个步骤能安装Nutch, 并且能爬行你的网站, 创建你自 ... -
深入Lucene的索引文件
2012-02-01 16:50 6846Lucene的索引里面存了些什么,如何存放的,也即Luc ... -
EasyMock and IllegalStateException
2012-01-31 15:09 1332When writing a portlet and tryi ... -
Java Enum的原理
2011-05-03 09:19 1813Java Enum 类型的语法结构尽管和 java 类的语法不 ... -
用JAXB从对象生成XML
2011-04-26 08:54 2971import java.io.FileOutputStream ... -
jdk6 WebService入门
2011-03-10 23:04 3365一、 Web Services简介 ... -
httpclient3 自动登陆淘宝, 开心网
2010-11-09 22:09 9982前提:需要用到的java包 commons-httpclien ... -
Lucene实时索引构建
2010-11-06 23:11 7415Lucene可以增量的添加一 ... -
分享Java并发最佳书籍Java Concurrency in Practice Java并发最佳书籍 下载
2010-10-21 08:31 13425好久没有上来更新过了,最近在学习线程池实现,参考了 Tomc ... -
Spring Hibernate3 配置 C3P0
2010-10-15 00:31 7547由于Hibernate3不推荐使用DBCP, 所以把连接池换成 ... -
将依赖包加入到本地maven库
2010-07-22 16:47 2883要将依赖包加入到本地maven库 mvn instal ... -
Maven Dependency设置,详解!
2010-07-21 17:08 2498用了Maven,所需的JAR包 ... -
Inner Join with hibernate and HQL
2010-07-18 12:24 2159String queryStri ... -
ORACLE 分组 排序出前面最大的N行
2010-07-02 09:18 1635select custid,carid,Cunote,INV ...
相关推荐
DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时的强大工具。DOM4J的最大亮点在于其简洁易用的API...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改和查询变得简单。DOM4J的名字来源于“Document Object Model for Java”,它采用面向对象的设计思想,提供了对...
Dom4J(Document Object Model for Java)是一款开源的、轻量级的Java库,用于处理XML文档。它提供了一套灵活且强大的API,使得开发者可以轻松地创建、读取、修改和输出XML数据。Dom4J的核心类`Document`代表整个XML...
"工具"标签则表明DOM4J被用作一个实用工具,帮助开发者更有效地处理XML文件。 【文件名称】"UML入门教程.pptx"看似与主题"DOM4J格式化XML"不直接相关,但可以假设它是博文作者提供的补充材料,可能是为了帮助读者更...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、查询和修改变得简单。这个压缩包包含了DOM4J的完整版本,适用于那些希望在Java项目中使用DOM4J进行XML操作的开发者...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得解析、创建、修改XML文件变得简单。在这个主题中,我们将深入探讨DOM4J如何递归地解析XML文件,并将解析结果映射到动态bean或Map中。 ...
1、xml文档解析 2、 dom4j解析xml 3、实现xml文件解析 xml字符串解析 xml MAP键值对解析 4、实现xml写入与生成文件
四、DOM4J处理循环节点 在处理包含循环节点的XML时,可以使用迭代器或XPath查询来遍历这些节点。例如,遍历所有`<item>`元素: ```java Element root = document.getRootElement(); List<Element> items = root....
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单且高效的API来读取、写入、修改以及操作XML。在这个实例中,我们将深入理解DOM4J库如何帮助我们处理XML文档,并通过实际操作来熟悉其核心功能。 XML...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的方式来解析、创建、修改和操作XML数据。在本教程中,我们将深入探讨如何使用DOM4J解析(读取)XML节点数据,不受XML层级的限制。 首先,确保你...
此外,DOM4J库还提供了许多其他功能,如XPath查询、XML文档的修改和创建等,这些都是处理XML数据的强大工具。 总之,DOM4J结合XSD提供了一种高效且灵活的方式来验证XML文件的结构和内容。这对于保证数据交换的准确...
在Java编程中,dom4j是一个流行的、功能丰富的库,用于处理XML文档,包括读取、写入、修改和解析。本文将详细介绍如何使用dom4j解析XML,并创建XML文档结构。 首先,我们需要引入dom4j库。如果你使用的是Maven项目...
DOM4J这个名字来源于Document Object Model (DOM) 和 Java 的结合,它提供了一个灵活且高性能的API来处理XML文档。与传统的DOM API相比,DOM4J更注重Java集合框架的集成,使得操作XML文档更加直观和高效。DOM4J的...
dom4j负责解析、构建和修改XML文档,而jaxen则作为XPath查询工具,两者结合可以高效地处理复杂的XML操作。在实际项目中,掌握这两个库的使用能极大地提高XML处理的效率和灵活性。通过实践"xml practice"中的例子,你...
DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J更加灵活和高效。DOM4J支持XPath表达式,这使得查询...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改和查询变得简单。DOM4J的名字来源于DOM(Document Object Model)和Java的结合,但它的设计理念比标准DOM更先进...
DOM4j则是一个强大的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、修改等操作。在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是...