java 根据子节点getTextContent值对xml元素进行排序

4nkexdtk  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(94)

我一直在尝试根据xml元素的子getTextContent值对它们进行重新排序,但是我尝试的所有方法都只适用于兄弟节点
基本上,我有这样的XML:

<order>
    <item>
        <item-id>d54829d52c3f2810VgnVCM1000001af614ac</item-id>
        <item-order>3</item-order>
    </item>
    <item>
        <item-id>b54829d52c3f2810VgnVCM1000001af614ac</item-id>
        <item-order>1</item-order>
    </item>
    <item>
        <item-id>f54829d52c3f2810VgnVCM1000001af614ac</item-id>
        <item-order>2</item-order>
    </item>
</order>

我希望通过使用"项目顺序"进行排序来实现以下结果:

<order>
    <item>
        <item-id>b54829d52c3f2810VgnVCM1000001af614ac</item-id>
        <item-order>1</item-order>
    </item>
    <item>
        <item-id>f54829d52c3f2810VgnVCM1000001af614ac</item-id>
        <item-order>2</item-order>
    </item>
    <item>
        <item-id>d54829d52c3f2810VgnVCM1000001af614ac</item-id>
        <item-order>3</item-order>
    </item>
</order>

我一直在尝试一些实现像这个例子基于下面的网站,我发现在互联网上,但它不工作。
http://programmatica.blogspot.com/2006/12/sorting-xml-in-java.htmlHow to sort XML elements by value of attributes in Java?

static class MyComparator4 implements Comparator {

        public int compare(Object arg0, Object arg1) {
    
            if (arg0 instanceof Element && arg1 instanceof Element) {
    
                Element e0 = (Element) arg0;
                Element e1 = (Element) arg0;

e0.getChildNodes().item(e0.getChildNodes().getLength()-1).getTextContent().compareTo(e1.getChildNodes().item(e1.getChildNodes().getLength()-1).getTextContent());

            } else {
                return ((Node) arg0).getNodeName().compareTo(
                        ((Node) arg1).getNodeName());
            }
    
        }
    
    }

任何帮助都是感激的。先谢谢你

dphi5xsq

dphi5xsq1#

您可以将第二个示例(link)中的类(公共类NodeTools)与Integer类一起使用,这是类似的。

Node[] ret = NodeTools.sortNodes(doc.getElementsByTagName("item"), "item-order", true, Integer.class);
sq1bmfud

sq1bmfud2#

根据@mazi的建议,我能够实现排序,只需稍微更改NodeTools.sortNodes方法。
基本上,我已经改变了这一部分:

bda = (Comparable)bc.newInstance(((Element)a).getAttribute(attributeName));
            bdb = (Comparable)bc.newInstance(((Element)b).getAttribute(attributeName));

对此:

bda = (Comparable)bc.newInstance(((Element)a).getElementsByTagName(attributeName).item(0).getTextContent());
            bdb = (Comparable)bc.newInstance(((Element)b).getElementsByTagName(attributeName).item(0).getTextContent());

下面是完整的代码:

import java.lang.reflect.Constructor;
    import java.util.*;
    
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import org.xml.sax.InputSource;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import java.io.StringReader;
    import org.w3c.dom.Document;
    
    public class NodeTools {
    
        public static Node[] sortNodes(NodeList nl, String attributeName, boolean asc, Class B)
        {
            class NodeComparator implements Comparator
            {
                @Override
                public int compare(T a, T b)
                {
                    int ret;
                    Comparable bda = null, bdb = null;
                    try{
                        Constructor bc = B.getDeclaredConstructor(String.class);
                        bda = (Comparable)bc.newInstance(((Element)a).getElementsByTagName(attributeName).item(0).getTextContent());
                        bdb = (Comparable)bc.newInstance(((Element)b).getElementsByTagName(attributeName).item(0).getTextContent());
                        //bda = (Comparable)bc.newInstance(((Element)a).getAttribute(attributeName));
                        //bdb = (Comparable)bc.newInstance(((Element)b).getAttribute(attributeName));
                    }
                    catch(Exception e)
                    {
                        return 0; // yes, ugly, i know :)
                    }
                    ret = bda.compareTo(bdb);
                    return asc ? ret : -ret;
                }
            }
    
            List x = new ArrayList();
            for(int i = 0; i ());
            return ret;
        }
    
        public static void main(String... args)
        {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder;
            String s = "\n" +
                    "    \n" +
                    "        d54829d52c3f2810VgnVCM1000001af614ac\n" +
                    "        3\n" +
                    "    \n" +
                    "    \n" +
                    "        b54829d52c3f2810VgnVCM1000001af614ac\n" +
                    "        1\n" +
                    "    \n" +
                    "    \n" +
                    "        f54829d52c3f2810VgnVCM1000001af614ac\n" +
                    "        2\n" +
                    "    \n" +
                    "";
    
            Document doc = null;
            try
            {
                builder = factory.newDocumentBuilder();
                doc = builder.parse(new InputSource(new StringReader(s)));
            }
            catch(Exception e) { System.out.println("Alarm "+e); return; }
    
            Node[] ret = NodeTools.sortNodes(doc.getElementsByTagName("item"), "item-order", true, Integer.class);
            for(Node n: ret)
            {
                System.out.println(((Element)n).getTextContent());
            }
        }
    }

下面是输出:

b54829d52c3f2810VgnVCM1000001af614ac
    1

    f54829d52c3f2810VgnVCM1000001af614ac
    2

    d54829d52c3f2810VgnVCM1000001af614ac
    3

相关问题