基于日期时间排序的XML节点属性C#,XPath的 [英] Sorting XML nodes based on DateTime attribute C#, XPath

查看:266
本文介绍了基于日期时间排序的XML节点属性C#,XPath的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 <销售和GT;
  <项目名称=游戏SKU =MIC28306200ICAT =28
     STIME =11/26/2008上午08点41分12秒
     价格=1.00DESC =项目名称/>
  <项目名称=游戏SKU =MIC28307100ICAT =28
     STIME =11/26/2008上午08点42分12秒
     价格=1.00DESC =项目名称/>
...
< /销售>

我试图找到一种方法进行排序的基础上的表准时属性,它是一个则DateTime.ToString()值的节点。诀窍是,我需要保持节点的机智和出于某种原因,我无法找到一个方法来做到这一点。我相当肯定LINQ和XPath有办法做到这一点,但我坚持,因为我似乎无法根据则DateTime.ToString的sort()值。

 的XPathDocument saleResults =新的XPathDocument(@温度/ salesD​​ata.xml);
XPathNavigator的导航= saleResults.CreateNavigator();XPathEx pression selectEx pression = navigator.Compile(销售/项目/ @ STIME);
selectEx pression.AddSort(@ STIME
    XmlSortOrder.Descending,
    XmlCaseOrder.None,
    ,
    XmlDataType.Number);声明XPathNodeIterator nodeIterator = navigator.Select(selectEx pression);而(nodeIterator.MoveNext())
    {
         字符串checkMe = nodeIterator.Current.Value;
    }

我还需要保持一个指向该节点以检索其他属性的值。

也许这不是一个简单的,因为我认为这将是。

感谢。

解决方案:这里是我最终使用。以选定的答案和IComparable的类这是我如何得到一个基于表准时属性,然后排序的XML节点获得所有属性到相应的阵列式供以后使用。

 的XPathDocument saleResults =新的XPathDocument(@温度/ salesD​​ata.xml);
    XPathNavigator的导航= saleResults.CreateNavigator();
    XPathEx pression selectEx pression = navigator.Compile(销售/项目);
    XPathEx pression sortExpr = navigator.Compile(@ STIME);
    selectEx pression.AddSort(sortExpr,新DateTimeComparer());
    声明XPathNodeIterator nodeIterator = navigator.Select(selectEx pression);
    INT I = 0;
    而(nodeIterator.MoveNext())
       {
          如果(nodeIterator.Current.MoveToFirstAttribute())
          {
              _iNameList.SetValue(nodeIterator.Current.Value,I);
          }
          如果(nodeIterator.Current.MoveToNextAttribute())
          {
              _iSkuList.SetValue(nodeIterator.Current.Value,I);
          }
          ...
          nodeIterator.Current.MoveToParent();
          我++;      }


解决方案

有这需要一个的Icomparable接口XPathEx pression.Addsort过载。如果你自己实现的比较,因为IComparer的,你可以利用这一机制。

 类节目
        {
            静态无效的主要(字串[] args)
            {
                XPathDocument中saleResults =新的XPathDocument(@salesD​​ata.xml);
                XPathNavigator的导航= saleResults.CreateNavigator();
                XPathEx pression selectEx pression = navigator.Compile(销售/项目);
                XPathEx pression sortExpr = navigator.Compile(@ STIME);
                selectEx pression.AddSort(sortExpr,新DateTimeComparer());
                声明XPathNodeIterator nodeIterator = navigator.Select(selectEx pression);
                而(nodeIterator.MoveNext())
                {
                    字符串checkMe = nodeIterator.Current.Value;
                }
            }
            公共类DateTimeComparer:的IComparer
            {
                公众诠释比较(对象x,对象Y)
                {
                    日期时间DT1 = DateTime.Parse(x.ToString());
                    日期时间DT2 = DateTime.Parse(y.ToString());
                    返回dt1.CompareTo(DT2);
                }
            }
        }

I have a XML Structure that looks like this.

<sales>
  <item name="Games" sku="MIC28306200" iCat="28" 
     sTime="11/26/2008 8:41:12 AM" 
     price="1.00" desc="Item Name" />
  <item name="Games" sku="MIC28307100" iCat="28" 
     sTime="11/26/2008 8:42:12 AM" 
     price="1.00" desc="Item Name" />
...
</sales>

I am trying to find a way to SORT the nodes based on the sTime attribute which is a DateTime.ToString() value. The trick is I need to keep the Nodes in tact and for some reason I can't find a way to do that. I'm fairly certain that LINQ and XPath have a way to do it, but I'm stuck because I can't seem to sort based on DateTime.ToString() value.

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;
    }

I also need to maintain a pointer to the NODE to retrieve the values of the other attributes.

Perhaps this isn't a simple as I thought it would be.

Thanks.

Solution: Here's what I ended up using. Taking the selected answer and the IComparable class this is how I get the XML nodes sorted based on the sTime attribute and then get the all the attributes into the appropriate Arrays to be used later.

    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++;

      }

解决方案

There's an overload of XPathExpression.Addsort which takes an IComparer interface. If you implement the comparison yourself as IComparer, you could use this mechanism.

 class Program
        {
            static void Main(string[] args)
            {
                XPathDocument saleResults = new XPathDocument( @"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 );            
                while ( nodeIterator.MoveNext( ) )
                {
                    string checkMe = nodeIterator.Current.Value;
                }
            }
            public class DateTimeComparer : IComparer
            {
                public int Compare(object x, object y)
                {
                    DateTime dt1 = DateTime.Parse( x.ToString( ) );
                    DateTime dt2 = DateTime.Parse( y.ToString( ) );
                    return dt1.CompareTo( dt2 );
                }
            }
        }

这篇关于基于日期时间排序的XML节点属性C#,XPath的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆