使用DOM解析器对XML中的节点进行排序

时间:2019-06-27 03:17:27

标签: java xml domparser

如何根据标签对XML节点进行排序并附加  使用DOM解析器的新XML或可以使用DOM解析器完成。我们已经  广泛使用DOM解析器将节点追加到新文件中,但我无法对节点进行排序。

任何帮助将不胜感激。

Input.xml

<rss version="2.0">
    <Configs>
        <Value>defaultValue</Value>
        <Config name="test1">
            <title>Title 1</title>
            <author>Author1</author>
            <value>5600</value>
            <order>02</order>
        </Config>
        <Config name="test2">
            <title>Title 2</title>
            <author>Author2</author>
            <Value>6100</Value>
            <order>01</order>
        </Config>
    </Configs>
    <Ratings>
        <body>
            <Items name="ac_object1">
                <something1>something1</something1>
                <value>someValue1</value>
                <order>02</order>
            </Items>
            <Items name="op_object2">
                <something1>something2</something1>
                <value>someValue2</value>
                <order>03</order>
            </Items>
            <Items name="vt_object3">
                <something1>something3</something1>
                <value>someValue3</value>
                <order>01</order>
            </Items>
        </body>
    </Ratings>
</rss>

预期的Output.xml

<rss version="2.0">
    <Configs>
        <Value>defaultValue</Value>
        <Config name="test2">
            <title>Title 2</title>
            <author>Author2</author>
            <Value>6100</Value>
            <order>01</order>
        </Config>
        <Config name="test1">
            <title>Title 1</title>
            <author>Author1</author>
            <value>5600</value>
            <order>02</order>
        </Config>
    </Configs>
    <Ratings>
        <body>
            <Items name="vt_object3">
                <something1>something3</something1>
                <value>someValue3</value>
                <order>01</order>
            </Items>
            <Items name="ac_object1">
                <something1>something1</something1>
                <value>someValue1</value>
                <order>02</order>
            </Items>
            <Items name="op_object2">
                <something1>something2</something1>
                <value>someValue2</value>
                <order>03</order>
            </Items>
        </body>
    </Ratings>
</rss>

1 个答案:

答案 0 :(得分:0)

您真的不想使用低级DOM接口执行此操作。这是在XSLT 3.0(在安装Saxon-HE后可以从Java调用)中执行此操作的方法:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform> version="3.0">
    <xsl:mode on-no-match="shallow-copy"/>
    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="*[*/order]">
        <xsl:copy>
            <xsl:apply-templates>
                <xsl:sort select="number(order)"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

使用一些额外的代码行,您还可以使用JDK附带的XSLT 1.0。

工作原理:

  • xsl:mode声明说,元素的默认操作是复制元素,然后处理其子元素

  • xsl:strip-space说忽略输入中的空格

  • xsl:output说在输出中添加缩进

  • xsl:template规则表示,在处理其子孙中具有order个元素的元素时,请复制开始和结束标签,并按数字值的排序顺序处理子项。他们的order子元素。