【问题标题】:How do you sort an XDocument parent node based its child?如何根据子节点对 XDocument 父节点进行排序?
【发布时间】:2013-05-14 20:15:48
【问题描述】:

在 C# 中,我尝试使用 OrderByDescendingXDocument 进行排序。目标是读取包含日期/时间戳的子节点之一并重新排序父节点。

我从保存的文件中加载 XML,如下所示:

XDocument Doc = new XDocument();
Doc= XDocument.Load(filename);

这是我的 XML 示例:

<KS>
  <Team>   
    <TeamName>Knights</TeamName>
    <TeamColor>blue</TeamColor>
    <LastAccessed>5/9/2013 2:34:22 PM</LastAccessed>
  </Team>
  <Team>
    <TeamName>Rangers</TeamName>
    <TeamColor>red</TeamColor>
    <LastAccessed>5/9/2013 3:49:06 PM</LastAccessed>
  </Team>
  <Team>
    <TeamName>Eagles</TeamName>
    <TeamColor>green</TeamColor>    
    <LastAccessed>5/9/2013 3:50:18 PM</LastAccessed>
  </Team>
</KS>

我想根据子元素 &lt;LastAccessed&gt; 降序排列 &lt;Team&gt;

我尝试了以下方法,但没有任何运气:

var results = Doc.Root.Descendants("Team").OrderByDescending(p => p.Element("LastAccessed"));

XDocument node = new XDocument(Doc.Descendants("KS").OrderByDescending(x => x.Element("Team").Element("LastAccessed").Value.Trim()));

有什么建议可以根据存储在子节点中的值对 XML 父节点进行排序吗?

【问题讨论】:

  • 你使用什么日期时间格式?

标签: c# xml linq linq-to-xml


【解决方案1】:

你应该得到一个错误提示:

至少一个对象必须实现 IComparable。

请始终在您的问题中包含这些错误。

您需要提供支持IComparable 接口的Team 元素的子元素。您需要获得价值,而不是 .Elements 给您的 XElement

将您的结果行更改为以下内容即可。

var results = Doc.Descendants("Team").OrderByDescending(p => DateTime.Parse(p.Element("LastAccessed").Value));

【讨论】:

  • 所以15/9/2013 3:50:18 PM 以降序排列在5/9/2013 3:50:18 PM 之后?
【解决方案2】:
var results = Doc.Root.Descendants("Team").OrderByDescending(p =>    (DateTime)p.Element("LastAccessed"));

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多