根据属性订购XmlNodeList

本文关键字:XmlNodeList 属性 | 更新日期: 2023-09-27 18:18:36

我有一个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了,只能访问项目列表。

根据属性订购XmlNodeList

你应该试试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 );
   }

注意: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));

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

  • 我迭代我的XmlNodeList
  • 在迭代期间,我提取了时间戳在提取时间戳后,我将时间戳xmlelement添加到SortedDictionary
  • 将SortedDictionary转换为列表(sortedKeys = sortedbydatedictionary . keys . tolist ();)
  • 如果节点需要排序降序则sortedKeys.Reverse();
  • 节点可以通过排序键
  • 访问