【问题标题】:How to sort an XML file using .NET?如何使用 .NET 对 XML 文件进行排序?
【发布时间】:2009-04-04 04:53:15
【问题描述】:

因此,您有一个第三方 Web 服务,它喜欢滥用 XML 并以使您的编程完全痛苦的顺序返回内容。比如……

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

大约有一千种按价格排序。

如何按键值重新排序此 XML 文档?

我需要将结果作为已排序的 XML 文件。谢谢!

编辑: .NET 2.0 版(无 LINQ)

【问题讨论】:

  • 您应该定义排序的含义。我认为您发布的 XML 没有任何问题。
  • 假设我有一千个这样的节点按价格排序。我需要它们按键排序。

标签: .net xml sorting


【解决方案1】:

以下是使用 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>

【讨论】:

  • 不,我需要在解析 XML 之前对其进行排序。我希望有一种方法来对其进行排序而不将其强制转换为对象。
  • "您如何使用这些数据?"这不过是一个经典的 HTTP 请求,我有一个巨大的字符串要解析。
  • XSLT?请给我举个例子或其他东西 - 我一无所知!
  • 好的,我正在阅读有关 XSLT 的 W3 规范,但是选择字符串是什么?
  • 优秀的答案!重新格式化您的样式表以增强可读性。
【解决方案2】:

应用 Xml 样式表将源 XML 转换为适合您使用的 XML 格式。您可以在 xsl 转换期间轻松按值对元素进行排序。

【讨论】:

    【解决方案3】:

    当然是 XSLT 规则,但我会使用 LINQ To XML(即 System.Xml.Linq 命名空间中的内容)。具体来说,你需要做的是这样的:

    newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever);
    

    【讨论】:

      【解决方案4】:

      Linq to XML 会为您处理这个吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多