我有一个看起来像这样的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); }
这是一个完美运行的控制台应用程序.
干得好:
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); }
这是一个完美运行的控制台应用程序.