Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于属性的Order XmlNodeList_C#_Xml - Fatal编程技术网

C# 基于属性的Order XmlNodeList

C# 基于属性的Order XmlNodeList,c#,xml,C#,Xml,我有一个XmlNodeList,它包含来自下面XML示例根的数据包(项)。我想根据节点的键属性值对XmlNodeList进行排序。 排序必须非常有效,每毫秒计数一次 你知道吗 <root> <item key="1000000020"> Content 20 </item> <item key="1000000001"> Content 1 </item> ...

我有一个XmlNodeList,它包含来自下面XML示例根的数据包(项)。我想根据节点的键属性值对XmlNodeList进行排序。 排序必须非常有效,每毫秒计数一次

你知道吗

<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()
  • 然后可以通过排序的键访问节点

注意: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));
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xml);
IEnumerable rows=doc.SelectNodes(“报表/表格/行”).Cast().OrderByDescending(r=>Convert.ToDecimal(r.Attributes[“conversions”].Value));

这将非常优雅,但不行,因为我无权访问XmlDocument,只能访问XmlNodeList。@Germstorm-您可以尝试使用XPathExpression和XPathNavigator。请参阅“更新我的帖子”。如果多个节点具有相同的时间戳怎么办?