基于日期时间排序的XML节点属性C#,XPath的 [英] Sorting XML nodes based on DateTime attribute 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(@温度/ salesData.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(@温度/ salesData.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(@salesData.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屋!