【问题标题】:Sort nodes in XML using DOM parser使用 DOM 解析器对 XML 中的节点进行排序
【发布时间】:2019-06-27 03:17:27
【问题描述】:

如何根据标签对 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>

【问题讨论】:

    标签: java xml domparser


    【解决方案1】:

    您真的不想使用低级 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 的数值排序的顺序处理子元素子元素。

    【讨论】:

    • 谢谢,但我必须过滤很多元素。输入的 xml 文件非常大。再加上根据输入的参数,我们要对基础xml进行修改,创建一个新的xml文件。因此,我认为挖掘元素并执行诸如复制节点和更新值之类的操作会更容易。排序是唯一让我使用 DOM 解析器感到困惑的事情。
    • 你所说的一切似乎都加强了使用像 XSLT 这样的高级语言来完成工作而不是使用低级 DOM 调用的理由。当然,这是您的决定。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多