Как отсортировать файл XML с помощью .NET? - PullRequest
4 голосов
/ 04 апреля 2009

Таким образом, у вас есть сторонний веб-сервис, который любит злоупотреблять XML и возвращать вещи в том порядке, который делает ваше программирование мучительным занятием. Например ...

<file>
  <node1>Foo</node1>
  <price>4.99</price>
  <node2>
    <key>XX999</key>
  </node2>
</file>

Есть порядка тысячи таких, отсортированных по цене.

Как можно отсортировать этот XML-документ по значению ключа?

Мне нужен результат для сортированного файла XML. Спасибо!

EDIT: .NET версия 2.0 (без LINQ)

Ответы [ 4 ]

11 голосов
/ 04 апреля 2009

Вот как это сделать с XSLT:

при условии, что ваши данные принимают эту форму (file.xml):

<?xml version="1.0"?>
<listing>
<file>
  <node1>Foo</node1>
  <price>4.99</price>
  <node2>
    <key>XX999</key>
  </node2>
</file>
<file>
  <node1>Bar</node1>
  <price>5.67</price>
  <node2>
    <key>aa743</key>
  </node2>
</file>
<file>
  <node1>Was</node1>
  <price>5.67</price>
  <node2>
    <key>rr321</key>
  </node2>
</file>
</listing>

Это преобразование (stylesheet.xsl):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="listing">
    <xsl:copy>
      <xsl:apply-templates select="file">
        <xsl:sort select="node2/key" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

При использовании с этим кодом .Net (необходимо добавить using System.Xml;):

XslCompiledTransform xslt= new XslCompiledTransform();
xslt.Load(@"c:\stylesheet.xsl");

xslt.Transform(@"C:\file.xml", @"c:\sorted.xml");

Результаты этого вывода в sorted.xml:

<?xml version="1.0" encoding="utf-8"?>
<listing>
  <file>
    <node1>Bar</node1>
    <price>5.67</price>
    <node2>
      <key>aa743</key>
    </node2>
  </file>
  <file>
    <node1>Was</node1>
    <price>5.67</price>
    <node2>
      <key>rr321</key>
    </node2>
  </file>
  <file>
    <node1>Foo</node1>
    <price>4.99</price>
    <node2>
      <key>XX999</key>
    </node2>
  </file>
</listing>
3 голосов
/ 04 апреля 2009

Применение таблицы стилей Xml для преобразования исходного XML в формат XML, подходящий для вашего использования. Вы можете легко сортировать элементы по значениям во время преобразования xsl.

1 голос
/ 04 апреля 2009

Правила XSLT, конечно, но я бы пошел с LINQ To XML (то есть, что находится в пространстве имен System.Xml.Linq). В частности, что вам нужно сделать, это что-то вроде этого:

newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever);
0 голосов
/ 04 апреля 2009

Будет ли Linq to XML обрабатывать это для вас?

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