当前位置:  开发笔记 > 编程语言 > 正文

基于DateTime属性C#,XPath对XML节点进行排序

如何解决《基于DateTime属性C#,XPath对XML节点进行排序》经验,为你挑选了1个好方法。

我有一个看起来像这样的XML结构.


  
  
...

我试图找到一种方法来根据sTime属性SORT节点,这是一个DateTime.ToString()值.诀窍是我需要保持节点的机智,由于某种原因,我找不到办法做到这一点.我很确定LINQ和XPath有办法做到这一点,但我被卡住了,因为我似乎无法根据DateTime.ToString()值进行排序.

XPathDocument saleResults = new XPathDocument(@"temp/salesData.xml");
XPathNavigator navigator = saleResults.CreateNavigator();

XPathExpression selectExpression = navigator.Compile("sales/item/@sTime");
selectExpression.AddSort("@sTime", 
    XmlSortOrder.Descending, 
    XmlCaseOrder.None, 
    "", 
    XmlDataType.Number);

XPathNodeIterator nodeIterator = navigator.Select(selectExpression);

while( nodeIterator.MoveNext() )
    {
         string checkMe = nodeIterator.Current.Value;
    } 

我还需要维护一个指向NODE的指针来检索其他属性的值.

也许这并不像我想的那么简单.

谢谢.

解决方案:这是我最终使用的内容.获取所选答案和IComparable类,这就是我如何根据sTime属性对XML节点进行排序,然后将所有属性放入相应的Arrays中以便稍后使用.

    XPathDocument saleResults = new XPathDocument(@"temp/salesData.xml");
    XPathNavigator navigator = saleResults.CreateNavigator();
    XPathExpression selectExpression = navigator.Compile("sales/item");
    XPathExpression sortExpr = navigator.Compile("@sTime");
    selectExpression.AddSort(sortExpr, new DateTimeComparer());
    XPathNodeIterator nodeIterator = navigator.Select(selectExpression);
    int i = 0;
    while (nodeIterator.MoveNext())
       {
          if (nodeIterator.Current.MoveToFirstAttribute())
          {
              _iNameList.SetValue(nodeIterator.Current.Value, i);
          }
          if (nodeIterator.Current.MoveToNextAttribute())
          {
              _iSkuList.SetValue(nodeIterator.Current.Value, i);
          }
          ...
          nodeIterator.Current.MoveToParent();
          i++;

      }

Timothy Khou.. 5

干得好:

XmlDocument myDoc = new XmlDocument();

myDoc.LoadXml(@"




");

var sortedItems = myDoc.GetElementsByTagName("item").OfType()
    .OrderBy(item => DateTime.ParseExact(item.GetAttribute("sTime"), "MM/dd/yyyy h:mm:ss tt", null));

foreach (var item in sortedItems)
{
    Console.WriteLine(item.OuterXml);
}

这是一个完美运行的控制台应用程序.



1> Timothy Khou..:

干得好:

XmlDocument myDoc = new XmlDocument();

myDoc.LoadXml(@"




");

var sortedItems = myDoc.GetElementsByTagName("item").OfType()
    .OrderBy(item => DateTime.ParseExact(item.GetAttribute("sTime"), "MM/dd/yyyy h:mm:ss tt", null));

foreach (var item in sortedItems)
{
    Console.WriteLine(item.OuterXml);
}

这是一个完美运行的控制台应用程序.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有