Сортировка узлов в XML с использованием DOM-парсера - PullRequest
1 голос
/ 27 июня 2019

Как можно отсортировать узлы XML по тегу и добавить в новый XML с помощью анализатора DOM или это можно сделать с помощью анализатора 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>

Ожидаемый результат.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 голосов
/ 27 июня 2019

Вы действительно не хотите делать это, используя низкоуровневые интерфейсы DOM. Вот как это сделать в XSLT 3.0 (который можно вызвать из Java после установки Saxon-HE):

<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>

С помощью нескольких дополнительных строк кода вы также можете сделать это с помощью XSLT 1.0, который поставляется в комплекте с JDK.

Как это работает:

  • В объявлении xsl:mode говорится, что действие по умолчанию для элементов состоит в том, чтобы скопировать элемент и затем обработать его дочерние элементы

  • xsl:strip-space говорит, что игнорирует пробелы во входных данных

  • xsl:output говорит о добавлении отступа в выводе

  • Правило xsl:template гласит, что при обработке элемента, у которого среди внуков есть элементы order, скопируйте начальный и конечный теги и обработайте дочерние элементы в отсортированном порядке числового значения их order дочерний элемент.

...