Сортировка файла XML - PullRequest
       6

Сортировка файла XML

2 голосов
/ 17 декабря 2009

Мне нужно отсортировать XML по именам тегов и атрибутам. Возможно ли использовать DOM?

Мне нужен результат в отсортированном XML-файле, а не в HTML.

например:

<books>
    <book id='1'>
        <name value='N1'/>
        <author value='A1'/>
    </book>
    <book id='3'>
        <name value='N3'/>
        <author value='A3'/>
    </book>
    <book id='2'>
        <author value='A2'/>
        <name value='N2'/>
    </book>
</books>

Я ожидаю получить после sortXML ('id')

<books>
    <book id='1'>
        <author value='A1'/>
        <name value='N1'/>      
    </book>
    <book id='2'>
        <author value='A2'/>
        <name value='N2'/>
    </book>
    <book id='3'>
        <author value='A3'/>
        <name value='N3'/>      
    </book>
</books>

XML сортируется по именам тегов , затем по id

Ответы [ 3 ]

3 голосов
/ 17 декабря 2009

Вы можете написать XSL, который сортирует ваши данные с помощью sort-element и преобразует ваш XML-документ с ним, если ваша реализация DOM поддерживает XSL-преобразования.

В качестве альтернативы вы можете извлечь все элементы в массив и реализовать алгоритм сортировки, например, пузырьковая сортировка , для сортировки элементов массива.

Или, если вы используете .Net DOM, вы можете использовать сортирующий XPath-запрос. XPath сама по себе не поддерживает сортировку, но в реализации .Net предусмотрен метод XPathExpression.AddSort .

1 голос
/ 17 декабря 2009

Просто добавьте xsl, предложенный Винцем:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="books">
        <books>
            <xsl:apply-templates select="book">
                <xsl:sort select="@id" data-type="number" order="ascending" />
            </xsl:apply-templates>
        </books>
    </xsl:template>

    <xsl:template match="book">
        <book>
            <xsl:attribute name="id">
                <xsl:value-of select="@id"/>
            </xsl:attribute>
            <xsl:apply-templates>
                <xsl:sort select="local-name()" data-type="text" order="ascending" />
            </xsl:apply-templates>
        </book>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
1 голос
/ 17 декабря 2009

Использование Java:

  • создать список 'Элементов'
  • переберите все элементы book в разделе books и добавьте его в список.
  • отсоединить все «книги» от родительских «книг»
  • сортировка списка с использованием пользовательского Comparator<Element>

    Компаратор <Элемент> { int CompareTo (Элемент a, Элемент b) { / * сравнить значения a / author и b / author * / } }

  • переберите все Элемент в вашем списке и вставьте его обратно в «книги»

Использование xslt:

см. Xsl: for-each и xsl: sort

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...