今天在读取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.

dom4j-BackedList排序问题相关推荐

  1. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  2. MySQL中对varchar类型排序问题的解决

    mysql数据库,把数值型的写成varchar类型 ,其实应该建为int的.因为我只允许输出数字.发现排序有问题.下面简单说一下MySQL的varchar排序问题. 下面,我从数据库里面以number ...

  3. 使用Dom4j操作XML数据

    --------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 XML 数据 特点:性能优异.功能强大.极端易用 dom ...

  4. 使用dom4j解析XML例子

    包括三个文件:studentInfo.xml(待解析的xml文件), Dom4jReadExmple.java(解析的主要类), TestDom4jReadExmple.java(测试解析的结果) 代 ...

  5. dom4j读写xml文件

    dom4j读写xml文件 首先我们给出一段示例程序: import java.io.File; import java.io.FileWriter; import java.util.Iterator ...

  6. 关于spring aop Advisor排序问题

    关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序,这时候可以用注解org.springframework.core.annotation.Order或 ...

  7. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  8. Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/61194594 背景 记录项目中遇到的 关于 ...

  9. JavaWeb学习笔记——DOM4J

    下载的地址为:http://www.dom4j.org/dom4j-1.6.1/ import java.io.File; import java.io.FileOutputStream; impor ...

最新文章

  1. linux环境下 PYTHONPATH添加
  2. python常用类库_Python常用库
  3. 推荐 4 款 MySQL 调优工具,大神都在用!
  4. C#设计模式系列:享元模式(Flyweight)
  5. SQL Server 2005异地备份
  6. qduoj - WHY吃糖果(二分套二分)
  7. 算法:冒泡排序、一阶滤波
  8. 大数据安全分析需要关注哪些问题
  9. 米尔电子i.MX8开发板评测
  10. asp.net core mvc 项目搭建 二、hplus UI【干货教程】
  11. 除了WhatsApp以外,还有哪些即时聊天软件?
  12. 或非门sr锁存器_d锁存器与sr锁存器的区别
  13. 《红楼梦》中四大家族到底犯了什么罪,导致了「白茫茫大地真干净」的结局?
  14. 一文看全!史上以来的59家测序仪公司
  15. 行业分析报告-全球与中国客户调查软件市场现状及未来发展趋势
  16. 阿里云主机安全规则设置后端口依然不起作用的问题
  17. php之连接mssql(sql server)新手教程
  18. sql里面如何将年月日时分秒的格式转换成年月日
  19. 《程序员》专访:对话张宏江
  20. 计算机语言表示教师节快乐,教师节快乐的微信祝福语大全(精选80句)

热门文章

  1. 基于WeX5平台开发微信公众号中的在线问卷调查
  2. 如何用nginx部署静态网站
  3. 【LaTeX】表格调整行高、列宽、合并显示等操作
  4. video读取服务器本地的视频文件,javascript-video.js无法读取本地视频
  5. MAC install MySQL and DBeaver
  6. Excel2007将汉字转换为拼音首字母
  7. 万豪 数据泄露 sql注入_如何防止数据库泄漏和注入
  8. 计算机底层知识之内存
  9. 王者荣耀服务器维护中有什么漏洞,王者荣耀:玩家发现新漏洞,趁天美没修复,快试试...
  10. 从零开始学飞塔第一篇:飞塔防火墙基本上网配置(PPPoE拨号固定IP上网)FortiGate Broadband internet access