根据标记值对java列表中的XML行进行排序

根据标记值对java列表中的XML行进行排序,java,xml,list,sorting,Java,Xml,List,Sorting,我有一个加载了XML行的列表,可以按照以下任意顺序排列 <MAIN_TAG> <TAG_ONE>22</TAG_ONE> <TAG_TWO>2</TAG_TWO> <TAG_THREE>junk</TAG_THREE> <TAG_FOUR>8888</TAG_FOUR> <TAG_FIVE>arcdf</TAG_FIVE>

我有一个加载了XML行的列表,可以按照以下任意顺序排列

<MAIN_TAG>
    <TAG_ONE>22</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>8888</TAG_FOUR>
    <TAG_FIVE>arcdf</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>3</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>522</TAG_FOUR>
    <TAG_FIVE>00561</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>10</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>200</TAG_FOUR>
    <TAG_FIVE>ggggg</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>1</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>951</TAG_FOUR>
    <TAG_FIVE>56756</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>35</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>071</TAG_FOUR>
    <TAG_FIVE>ds15s</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>2</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>071</TAG_FOUR>
    <TAG_FIVE>34534</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>40</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>45</TAG_FOUR>
    <TAG_FIVE>4rsss</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>42</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>35</TAG_FOUR>
    <TAG_FIVE>cdsss</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>20</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>10</TAG_FOUR>
    <TAG_FIVE>dssss</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>30</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>1</TAG_FOUR>
    <TAG_FIVE>dsdfe</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>

22
2.
废旧物品
8888
arcdf
更多的垃圾
3.
2.
废旧物品
522
00561
更多的垃圾
10
2.
废旧物品
200
ggggg
更多的垃圾
1.
2.
废旧物品
951
56756
更多的垃圾
35
2.
废旧物品
071
ds15s
更多的垃圾
2.
2.
废旧物品
071
34534
更多的垃圾
40
2.
废旧物品
45
4rsss
更多的垃圾
42
2.
废旧物品
35
CDSS
更多的垃圾
20
2.
废旧物品
10
DSSS
更多的垃圾
30
2.
废旧物品
1.
dsdfe
更多的垃圾
我希望能够根据用户传入的标记对这个Java列表进行排序。因此,以下内容将通过传入按“TAG_ONE”排序来排序

<MAIN_TAG>
    <TAG_ONE>1</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>951</TAG_FOUR>
    <TAG_FIVE>56756</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>2</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>071</TAG_FOUR>
    <TAG_FIVE>34534</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>3</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>522</TAG_FOUR>
    <TAG_FIVE>00561</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>10</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>200</TAG_FOUR>
    <TAG_FIVE>ggggg</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>20</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>10</TAG_FOUR>
    <TAG_FIVE>dssss</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>22</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>8888</TAG_FOUR>
    <TAG_FIVE>arcdf</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>30</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>1</TAG_FOUR>
    <TAG_FIVE>dsdfe</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>35</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>071</TAG_FOUR>
    <TAG_FIVE>ds15s</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>40</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>45</TAG_FOUR>
    <TAG_FIVE>4rsss</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>
<MAIN_TAG>
    <TAG_ONE>42</TAG_ONE>
    <TAG_TWO>2</TAG_TWO>
    <TAG_THREE>junk</TAG_THREE>
    <TAG_FOUR>35</TAG_FOUR>
    <TAG_FIVE>cdsss</TAG_FIVE>
    <TAG_SIX>more junk</TAG_SIX>
</MAIN_TAG>

1.
2.
废旧物品
951
56756
更多的垃圾
2.
2.
废旧物品
071
34534
更多的垃圾
3.
2.
废旧物品
522
00561
更多的垃圾
10
2.
废旧物品
200
ggggg
更多的垃圾
20
2.
废旧物品
10
DSSS
更多的垃圾
22
2.
废旧物品
8888
arcdf
更多的垃圾
30
2.
废旧物品
1.
dsdfe
更多的垃圾
35
2.
废旧物品
071
ds15s
更多的垃圾
40
2.
废旧物品
45
4rsss
更多的垃圾
42
2.
废旧物品
35
CDSS
更多的垃圾
但最好能选择按“TAG_FOUR”排序

提前感谢您的帮助


Stacksamus

这是一个完整的解决方案

首先,我定义了两个非常简单的类来表示XML中的数据:
Wrapper
MainTag
。包装器只是将
MAIN_标记
元素包装在一个列表中,这是
JAXB
所需要的。
MainTag
类只保存公共属性,与输入中显示的属性完全相同

一旦读取了输入,我就按任意选择的标记对其进行排序(由int索引标识,1表示标记1,2表示标记2等)。排序是在
Wrapper.sort()
方法中实现的,该方法将标记作为排序依据的参数

最后,我只需使用
JAXB
将结果打印到标准输出

输入略微修改(包装在
包装中
标记):


或者,您可以使用xslt实现这一点。您可以参数化要排序的标记、排序顺序、类型等。。无论您需要什么样的根元素。我举了个例子

import java.io.File;

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Test {

    public static void main(String[] args) throws Exception {
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File("sort.xslt"));
        Transformer transformer = factory.newTransformer(xslt);
        Source text = new StreamSource(new File("data.xml"));
        transformer.setParameter("tagName", "TAG_ONE");
        transformer.transform(text, new StreamResult(new File("output.xml")));
        System.out.println("Done");
    }

}
sort.xslt

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:param name="tagName" />
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates>
                <xsl:sort data-type="number" select="*[name() = $tagName]" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>


使用XML解析器将其转换为对象列表,然后使用各种比较器对各个字段上的对象列表进行排序。基本思想:1。解析xml 2。排序由解析的XML创建的对象3.从排序的对象列表中生成XML。谢谢大家的帮助和建议:非常感谢您的解决方案:)如果这回答了您的问题,请考虑支持和接受答案。
Wrapper w = JAXB.unmarshal(new File("input.xml"), Wrapper.class);
w.sort(1);
JAXB.marshal(w, System.out);
import java.io.File;

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Test {

    public static void main(String[] args) throws Exception {
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File("sort.xslt"));
        Transformer transformer = factory.newTransformer(xslt);
        Source text = new StreamSource(new File("data.xml"));
        transformer.setParameter("tagName", "TAG_ONE");
        transformer.transform(text, new StreamResult(new File("output.xml")));
        System.out.println("Done");
    }

}
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:param name="tagName" />
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates>
                <xsl:sort data-type="number" select="*[name() = $tagName]" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>