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

标签 java xml domparser

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

任何帮助将不胜感激。

输入.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>

预期输出.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>

最佳答案

您确实不想使用低级 DOM 接口(interface)来执行此操作。以下是在 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 子元素的数值的排序顺序处理子元素。

关于java - 使用 DOM 解析器对 XML 中的节点进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56783426/

相关文章:

javascript - 如何将文档 CSS 属性应用于已解析的元素而不将其附加到 DOM

javascript - 如何在 JavaScript 中将通配符元素名称与 "querySelector()"或 "querySelectorAll()"匹配?

javascript - DOMParser - 子元素不是 DOM 对象

java - 在 Swagger 中使用@ApiParam或@ApiModelProperty?

java - Android 应用程序在 SDK-tools 更新版本后崩溃(NoClassDefFound,工具版本 22)

java - 根据 Controller 返回值调用javascript方法

php - XML AJAX 响应开头有奇怪的字符?

ios - 多个 iOS GET 请求(动态请求数)

java意外和不负责任的循环中断

c# - XML 格式错误