根据属性订购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了,只能访问项目列表。
你应该试试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;
你可以试试XPathNavigator
和XPathExpression
。
//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();
- 节点可以通过排序键 访问