C# 基于属性的Order XmlNodeList
我有一个XmlNodeList,它包含来自下面XML示例根的数据包(项)。我想根据节点的键属性值对XmlNodeList进行排序。 排序必须非常有效,每毫秒计数一次 你知道吗C# 基于属性的Order XmlNodeList,c#,xml,C#,Xml,我有一个XmlNodeList,它包含来自下面XML示例根的数据包(项)。我想根据节点的键属性值对XmlNodeList进行排序。 排序必须非常有效,每毫秒计数一次 你知道吗 <root> <item key="1000000020"> Content 20 </item> <item key="1000000001"> Content 1 </item> ...
<root>
<item key="1000000020">
Content 20
</item>
<item key="1000000001">
Content 1
</item>
...
<item key="1043245231">
Content n
</item>
</root>
内容20
内容1
...
内容n
编辑:
我已经从这些项构造了一个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 );
}
我以一种非常不优雅的方式解决了这个问题:
- 我迭代了XmlNodeList
- 在迭代过程中,我提取了时间戳
- 提取时间戳后,我将timestamp XmlElement添加到SortedDictionary中
- 将SortedDictionary转换为list(sortedKeys=sortedByDateDisctionary.Keys.ToList();)
- 如果节点需要降序排序,则sortedKeys.Reverse()李>
- 然后可以通过排序的键访问节点
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));
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xml);
IEnumerable rows=doc.SelectNodes(“报表/表格/行”).Cast().OrderByDescending(r=>Convert.ToDecimal(r.Attributes[“conversions”].Value));
这将非常优雅,但不行,因为我无权访问XmlDocument,只能访问XmlNodeList。@Germstorm-您可以尝试使用XPathExpression和XPathNavigator。请参阅“更新我的帖子”。如果多个节点具有相同的时间戳怎么办?