今天在读取xml文件进行排序时,报了一个很奇怪的问题,把处理结果记录如下:
InputStream in = new FileInputStream("D:/news_02120101_0212010102.xml");
Reader reader = new InputStreamReader(in, "utf-8");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(reader);
Element tempE = (Element) document.getRootElement().elements("channel").get(0); // item +
List<Element> list = tempE.elements("item");
Collections.sort(list, new ComparatorElement());
错误信息:
org.dom4j.IllegalAddException: The node "org.dom4j.tree.DefaultElement@da2cef [Element: <item attributes: []/>]" could not be added to the element "channel" because: The Node already has an existing parent of "channel"
at org.dom4j.tree.AbstractElement.addNode(AbstractElement.java:1533)
at org.dom4j.tree.BackedList.set(BackedList.java:92)
at java.util.AbstractList$ListItr.set(AbstractList.java:412)
at java.util.Collections.sort(Collections.java:163)
at cn.wasu.ftp.main.WinMain.main(WinMain.java:87)
原因:List<Element> list = tempE.elements("item");
这里得到的list是BackedList,这个list不允许存在重复元素,而Collections.sort方法在拷贝的时候,会使得list里面存在重复的元素,所以就报错了。
解决办法:自己new ArrayList,然后把list的节点拷贝到新的list里面。
备注1:
Collections.sort源码:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
参考地址:
http://sourceforge.net/p/dom4j/bugs/46/
This is not a bug: the Collections.sort() algorithm requires
the List to be fully modifiable, which is not entirely the
case with the BackedList because it does not allow duplicate
items. To sort the List, another algorithm should be used
which doesn't require that the list should allow duplicate
entries.
分享到:
相关推荐
JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活、高效的API,使得XML的解析、创建、修改和查询变得简单。这次我们有两个版本的DOM4J库:1.6.1和2.0.0-ALPHA。这两个版本在功能、性能和API设计上都有所...
另一份重要的资源是"dom4j-2.1.3-sources.jar",它提供了DOM4J库的源代码,允许开发者深入研究DOM4J的内部实现,对于理解DOM4J的工作原理、进行扩展或者调试都是不可或缺的。通过阅读源代码,开发者可以学习到如何...
赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...
《dom4j-1.6.1.jar:Java XML处理的得力助手》 在Java开发中,XML(eXtensible Markup Language)是数据交换和文档存储的常见格式,而dom4j-1.6.1.jar是针对Java平台的一个强大的、灵活的XML处理库。这个库提供了对...
这里的"dom4j-2.1.0.jar"是DOM4J库的二进制版本,而"dom4j-2.1.0-javadoc.jar"则是该库的API文档,用于帮助开发者理解和使用DOM4J的各种接口和类。 DOM4J的核心功能包括: 1. **XML解析**:DOM4J支持多种解析方式...
**DOM4J-1.6.1完整jar包** DOM4J是一个强大的Java库,用于处理XML、XPath和XSLT。它是一个灵活的、高性能的开源库,为XML解析和操作提供了丰富的功能。DOM4J 1.6.1是这个库的一个稳定版本,包含了对XML文档的创建、...
在项目中使用DOM4J时,只需将相应的jar包(如dom4j-1.6.1.jar、dom4j-2.0.2.jar或dom4j-2.1.1.jar)导入到类路径中,即可开始利用其功能处理XML文档。导入后,可以按照DOM4J提供的API进行编程,快速实现XML的读写...
四、DOM4J与其他XML库的比较 DOM4J与JDOM、XOM等其他XML处理库相比,其优势在于功能全面、性能优秀和广泛的社区支持。虽然Java标准库中的JAXB和DOM API提供了XML处理的基础功能,但DOM4J因其简洁的API和强大的功能...
《深入解析DOM4J——基于Java的XML处理框架》 ...通过阅读DOM4J的API文档(如`dom4j-2.0.3-javadoc.jar`),结合源码学习(`dom4j-2.0.3-sources.jar`),可以深入理解其实现原理并更好地利用它来解决实际问题。
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...
《dom4j-1.6.1.jar与ojdbc14_g.jar:解析与应用》 在Java开发中,库文件扮演着至关重要的角色,它们提供了丰富的功能,帮助开发者节省时间和精力,专注于业务逻辑的实现。本文将详细介绍两个重要的Java库——dom4j-...
赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...
dom4j-1.6.1-sources 源码
dom4j-2.0.3 jar包+javadoc包+sources包 dom4j-2.0.3 XML Document Object Model based on Java Collections Framework Java 5+ Generics support Released on April 11, 2020 从这个网址https://dom4j.github.io/...
dom4j-1.6.1.jar下载
4. **异常处理**: dom4j在源码中广泛使用了异常处理机制,如`DocumentException`和`IOException`,确保在处理XML时能捕获并处理可能出现的问题。 **五、使用示例** 以下是一个简单的dom4j使用示例: ```java import...
DOM4J-1.6.1.jar 和 XMLBeans-2.6.0.jar 是两个在Java开发中处理XML文档的库。它们各自提供了不同的方法来解析、操作和生成XML数据,尤其是在进行Excel导入导出这样的任务时,可能需要对XML进行复杂的操作。 DOM4J...