使用Comparator进行排序时,Content已有一个现有父级

时间:2014-06-12 05:03:30

标签: java comparator jdom-2

我使用jdom2从xml字符串中获取Element列表。 并希望通过getChildText对其进行排序 这是我的比较者

 public class ComparatorFunc implements Comparator {

        public int compare(Object arg0, Object arg1) {
            Element e1 = (Element)arg0;
            Element e2 = (Element)arg1;

            int flag = e1.getChildText("EntType").compareTo(e2.getChildText("EntType"));
            return flag;
        }

    }

-----这是我的代码:

String xmlStr = request.getParameter("xmlStr");
xmlStr = xmlStr.trim();
//System.out.println(xmlStr);

ByteArrayInputStream xmlStream = null;

try {
    xmlStream = new ByteArrayInputStream(xmlStr.getBytes("UTF-8"));
    if (xmlStream != null) {
        SAXBuilder builder = new SAXBuilder(false);
        org.jdom2.Document document = builder.build(xmlStream);

        Element root = document.getRootElement();

        List < Element > listItem = root.getChildren("item");
        ComparatorFunc comparator = new ComparatorFunc();
        Collections.sort(listItem, comparator);


        .....

但是我收到了这个错误:

org.jdom2.IllegalAddException: The Content already has an existing parent "design"

所以我该怎么办?

1 个答案:

答案 0 :(得分:0)

JDOM要求内容始终有效。这包括排序过程中的中间结果。

来自Java的本机排序方法首先通过设置&#39;来交换内容。它在新的地方才能删除&#39;它来自旧地方,创造了一个副本。

这是一个已知问题。

解决方案是使用sort method on the Element做出正确的事情&#39;。

如果需要,还可以使用sortContent()或sortAttributes()。

作为旁注,请考虑以下内容:

org.jdom2.Document document = builder.build(new StringReader(xmlStr));