我是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>
答案 0 :(得分:0)
根据docs,XmlTextReader
表示提供对XML数据的快速,非缓存,仅向前访问的读者。因此,对XML数据进行排序并不足够,因为排序需要比较和重新排列当前无序的元素。相反,XDocument
课程将是您最好的选择。
由于您只提供了XML的片段,因此不清楚您的元素Order
和orderdate
是否属于某些父元素的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
构建完整的Order
在Descendants
查询中使用:
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。