【问题标题】:Order XmlNodeList based on an attribute基于属性对 XmlNodeList 进行排序
【发布时间】:2014-12-21 05:37:16
【问题描述】:

我有一个 XmlNodeList,其中包含来自下面 XML 示例根的数据包(项目)。我想根据 节点的键属性值 对 XmlNodeList 进行排序。 排序必须非常高效,每一毫秒都很重要。

你有什么想法吗?

<root>
    <item key="1000000020">
        Content 20
    </item>
    <item key="1000000001">
        Content 1
    </item>
    ...
    <item key="1043245231">
        Content n
    </item>
</root>

编辑: 我已经有一个从项目构造的 XmlNodeList。我无法再访问 XmlDocument,只能访问项目列表。

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    你应该试试 Linq to XML。

     XDocument doc = XDocument.Load(file);
    
       var nodeList = from ele in doc.Descendants("item")
                       orderby int.Parse(ele.Attribute("key").Value)
                       select ele;
    

    你可以试试XPathNavigatorXPathExpression

     //I presume that variable xNodeList contains XmlNodeList.
      XPathNavigator nav=xNodeList.Item(0).OwnerDocument.CreateNavigator();
      XPathExpression exp = nav.Compile("root/item");
    
    
      exp.AddSort("@key", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number );
    
      foreach (XPathNavigator t in nav.Select(exp))
      {
        Console.WriteLine(t.OuterXml );
       }
    

    【讨论】:

    • 这将非常优雅,但不会这样做,因为我无法访问 XmlDocument,只能访问 XmlNodeList。
    • @Germstorm - 你可以试试 XPathExpression 和 XPathNavigator。请参阅我已更新我的帖子。
    【解决方案2】:

    注意:xml变量是字符串值

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    
    IEnumerable<XmlNode> rows = doc.SelectNodes("report/table/row").Cast<XmlNode>().OrderByDescending(r => Convert.ToDecimal(r.Attributes["conversions"].Value));
    

    【讨论】:

      【解决方案3】:

      我以一种非常不优雅的方式解决了这个问题:

      • 我迭代了我的 XmlNodeList
      • 在迭代过程中,我提取了时间戳
      • 提取时间戳后,我将 timestamp-XmlElement 添加到 SortedDictionary
      • 将 SortedDictionary 转换为列表 (sortedKeys = sortedByDateDisctionary.Keys.ToList();)
      • 如果节点需要降序排序,则 sortedKeys.Reverse();
      • 然后可以通过排序的键访问节点

      【讨论】:

      • 如果多个节点具有相同的时间戳怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2021-04-24
      • 2013-03-13
      • 2022-07-19
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多