【问题标题】:Sort xml by value with XmlTextReader C#使用 XmlTextReader C# 按值对 xml 进行排序
【发布时间】:2015-09-13 18:06:37
【问题描述】:

我是 C# 新手,目前正在使用 XML 文件。我偶然发现了 XmlTextReader 对象。我想按值对我的 XML 文件中的一些属性进行排序,但我找不到任何简单的方法来使用 XmlTextReader 做到这一点?

XDocument 有 OrderBy-property,但是 XmlTextReader 有类似的吗?

要排序的 XML

<Order>
  <orderdate>1998-04-22T00:00:00</orderdate>
</Order>
<Order>
  <orderdate>1998-04-07T00:00:00</orderdate>
</Order>
<Order>
  <orderdate>1998-04-30T00:00:00</orderdate>
</Order>

【问题讨论】:

  • 来自docs XmlTextReader 表示提供对 XML 数据的快速、非缓存、只进访问的阅读器。 所以基本上不,它不做排序,XDocument 可能是你最好的选择;如果您更详细地解释您的问题,我们也许可以提供替代建议。对了,这个类已经过时了,使用XmlReader.Create()
  • 我有一个包含日期的不同 属性的 xml 文件。我想根据它们的值按升序对这些属性进行排序。
  • 为什么要使用 xmltextreader 而不是 xdocument?
  • xmltextreader 似乎比 xdocument 好理解?但我会给 xdocument 一个机会。
  • 您发布的示例中没有 属性 - 只有具有文本值的元素。也不是说元素属性的 XML 顺序无关紧要 - 所以你的问题可能是关于其他事情,或者你在某种意义上使用与 XML 无关的术语“属性”。

标签: c# xml visual-studio


【解决方案1】:

根据docsXmlTextReader 表示提供对 XML 数据的快速、非缓存、只进访问的阅读器。对 XML 数据进行排序确实足够,因为排序需要比较和重新排列当前无序的元素。相反,XDocument 课程将是您最好的选择。

由于您只提供了 XML 的片段,因此不清楚您的元素 Orderorderdate 是否属于某个父元素的 default namespace。如果它们不属于任何命名空间,您可以使用XDocument.Descendants(XName)LINQ to XML 如下,利用XName 的字符串implicit conversion

        var items = xdocument.Descendants("Order")
            .OrderBy(o => (DateTime?)o.Element("orderdate"))
            .ToList();

如果元素属于根 XML 元素上指定的命名空间,您需要在查询中使用 XNamespace 指定该命名空间,您可以从中构造一个完整的 XName 用于 Order 以在您的 @987654339 中使用@查询:

        XNamespace ns = xdocument.Root.Name.Namespace;

        var items = xdocument.Descendants(ns + "Order")
            .OrderBy(o => (DateTime?)o.Element(ns + "orderdate"))
            .ToList();

或者,如果命名空间是由某个中间元素而不是根元素指定的,那么将命名空间指定为字符串文字可能是最简单的:

        XNamespace ns = "http://MiddleNamespace";

        var items = xdocument.Descendants(ns + "Order")
            .OrderBy(o => (DateTime?)o.Element(ns + "orderdate"))
            .ToList();

工作fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2013-08-30
    • 2021-09-16
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多