当前位置:编程学习 > JAVA >>

超大XML文件修改,请高手指教,谢谢!

有一个200M以上的XML文件,有三级节点,现在要做的是判断二级节点后,往符合条件的二级节点里面写三级节点内容。
直接用SAXReader的read方法加载整个XML文件,速度有点慢,效率太低。
用dom4j的ElementHandler重写onEnd方法用来读取XML中某个给定的xpath节点,但读到的仅仅是该节点的Element,如果得不到整个document,就没办法写入往二级节点里添加的三级节点内容。
不知道有没有哪位高手指教下,超大XML文件修改效率高的方法,在线等,谢谢!!! --------------------编程问答--------------------
SAXReader saxReader = new SAXReader(); 
Document document = saxReader.read(new File(filename));
list = document.selectNodes("/books/owner");
Iterator iter = list.iterator();
if(iter.hasNext()){
  Element ownerElement = (Element)iter.next();
  Element dateElement = ownerElement.addElement("date");
  dateElement.setText("2004-09-11");
  dateElement.addAttribute("type","写入日期");
}
writer.write(document);
writer.close();

--------------------编程问答-------------------- 使用 xml database + xquery update --------------------编程问答-------------------- 那就分节点加载~ --------------------编程问答-------------------- --------------------编程问答-------------------- http://download.csdn.net/detail/hanzengyi/1693068
百度的,记得回百度,谷歌大姐。。。。 --------------------编程问答-------------------- 百度  java读写 超大XML --------------------编程问答-------------------- 怒马!! --------------------编程问答--------------------
引用 1 楼 huangxw000 的回复:
Java code

SAXReader saxReader = new SAXReader(); 
Document document = saxReader.read(new File(filename));
list = document.selectNodes("/books/owner");
Iterator iter = list.iterator();
if(iter.h……


感谢你的回复,我已经说过此方法加载超大XML效率太低…… --------------------编程问答--------------------
引用 2 楼 huntor 的回复:
使用 xml database + xquery update


感谢你的回复,java中的解析方法么?能否更详细指教下,谢谢。 --------------------编程问答--------------------
引用 3 楼 hllfl 的回复:
那就分节点加载~


感谢你的回复,用dom4j的ElementHandler重写onEnd方法用来读取XML中某个给定的xpath节点,但读到的仅仅是该节点的Element,有没有方法在读到的Element下增加子Element,然后保存起来?请指教,谢谢! --------------------编程问答-------------------- 往200M的XML文件里写数据
1. 得重新创建一个临时文件,把所有的数据都写一次,文件的内容不能在中间插入
2. 使用SAX流的方式,一级一级的读取XML文件结点

最终结果,不管你是向此XML文件里写入多少东西,都是重写一个200M的临时文件,再复制回原来的地方,最终你至少要读取400M文件,写400M文件(最后一次可以使用文件复制),速度也可想而知,没办法,你不是向文件层追加内容,而是在中间修改新的值 --------------------编程问答-------------------- Dom4J是一次性读取所有文件到内存里,如果不介意读取一个200M的文件在内存中生成Dom树,是可以使用Dom4J的 --------------------编程问答--------------------
引用 12 楼 inhibitory 的回复:
Dom4J是一次性读取所有文件到内存里,如果不介意读取一个200M的文件在内存中生成Dom树,是可以使用Dom4J的

感谢你的回复,现在的问题就是效率问题,一次性读入整个大文件速度很慢啊,
如果只是往文件后追加内容有什么办法呢?能否具体点,谢谢。

--------------------编程问答--------------------
引用 13 楼 j315321 的回复:
引用 12 楼 inhibitory 的回复:
Dom4J是一次性读取所有文件到内存里,如果不介意读取一个200M的文件在内存中生成Dom树,是可以使用Dom4J的

感谢你的回复,现在的问题就是效率问题,一次性读入整个大文件速度很慢啊,
如果只是往文件后追加内容有什么办法呢?能否具体点,谢谢。

追加的话,直接使用普通的IO操作就可以了,例如PrintWriter,BufferedWriter等。 --------------------编程问答--------------------
引用
100w数据写入一个xml是不是有点大了?放到哪里去写压力都不小啊。。。更不说放到本地测试。。放到服务
器性能应该好些。。。
如果数据库数据是500W,1000W或者更大呢?放到一个文件中。。估计想优化效率。。不太可能。。

我的思路2还是这样:
我觉得你迟早都会分开xml处理。。分成N个小的xml,如每个20w,30w等等。。利用多文件。。多线程。。

想想平时遇到的批量操作。。多数都是采用流控,,说到底还是分批处理。。将大数据处理转变到小数据处理。。这时多线程方式就派上用场了。。
--------------------编程问答-------------------- 我读10K 的XML也要花2-3秒,是什么问题? --------------------编程问答-------------------- dom4j我以前用的很多   不管子节点都多少以及子节点的属性有多少都可以读取  楼主怎么能乱说呢 --------------------编程问答-------------------- 先查找节点在文件中的位置,让后直接向文件写。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,