使用XmlTextReader C#按值排序xml

时间:2015-09-13 18:06:37

标签: c# xml visual-studio

我是C#的新手,我正在使用XML文件。我已经对XmlTextReader对象进行了求和。我想按值在XML文件中对某些属性进行排序,但是我无法通过XmlTextReader找到任何简单的方法来执行此操作?

XDocument具有OrderBy属性,但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>

1 个答案:

答案 0 :(得分:0)

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

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

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

如果元素属于根XML元素上指定的命名空间,则需要使用XNamespace在查询中指定该命名空间,从中可以为XName构建完整的OrderDescendants查询中使用:

        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