SortXMLNodesBasedonDateTimeAttributeC#、XPath...我正在尝试找到一种基于sTime属性对节点进行排序的方法,该属性是一个DateTime.ToString()值。诀窍是我需要保持节点完好无损,但出于某种原因我找不到办法做到这一点。我很确定LINQ和XPath有办法做到这一点,但我被卡住了,因为我似乎无法根据DateTime.ToString()值进行排序。XPathDocumentsaleResults=newXPathDocument(@"temp/salesData.xml");XPathNavigator导航器=saleResults.CreateNavigator();XPathExpressionselectExpression=navigator.Compile("sales/item/@sTime");selectExpression.AddSort("@sTime",XmlSortOrder.Descending,XmlCaseOrder.None,"",XmlDataType.Number);XPathNodeIteratornodeIterator=navigator.Select(selectExpression);while(nodeIterator.MoveNext()){stringcheckMe=nodeIterator.Current.Value;我仍然需要维护指向NODE的指针以检索其他属性的值。也许它并不像我想的那么简单。谢谢。解决方案:这就是我最终使用的。以选择的答案和IComparable类,这就是我如何根据sTime属性对XML节点进行排序,然后将所有属性放入相应的Arrays中以备后用。XPathDocumentsaleResults=newXPathDocument(@"temp/salesData.xml");XPathNavigator导航器=saleResults.CreateNavigator();XPathExpressionselectExpression=navigator.Compile("sales/item");XPathExpressionsortExpr=navigator.Compile("@sTime");selectExpression.AddSort(sortExpr,newDateTimeComparer());XPathNodeIteratornodeIterator=navigator.Select(selectExpression);诠释我=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();我++;}XPathExpression.Addsort已重载,它采用IComparer接口。如果您自己将比较实现为IComparer,则可以使用此机制。类程序{staticvoidMain(string[]args){XPathDocumentsaleResults=newXPathDocument(@"salesData.xml");XPathNavigator导航器=saleResults.CreateNavigator();XPathExpressionselectExpression=navigator.Compile("sales/item");XPathExpressionsortExpr=navigator.Compile("@sTime");selectExpression.AddSort(sortExpr,newDateTimeComparer());XPathNodeIteratornodeIterator=navigator.Select(selectExpression);while(nodeIterator.MoveNext()){stringcheckMe=nodeIterator.Current.Value;}}publicclassDateTimeComparer:IComparer{publicintCompare(objectx,objecty){DateTimedt1=DateTime.Parse(x.ToString());DateTimedt2=DateTime.Parse(y.ToString());返回dt1.CompareTo(dt2);}}}干得好:XmlDocumentmyDoc=newXmlDocument();myDoc.LoadXml(@"");varsortedItems=myDoc.GetElementsByTagName("item").OfType().OrderBy(item=>DateTime.ParseExact(item.GetAttribute("sTime"),"MM/dd/yyyyh:mm:sstt",无效的));foreach(variteminsortedItems){Console.WriteLine(item.OuterXml);这是一个完美运行的控制台应用程序这是一个XSLT解决方案:当将此转换应用到以下XML文档时:产生正确的结果:如果您正确地构建XML,您尝试做的事情是微不足道的。XMLSchema建议日期/时间值应以ISO8601格式表示,即CCCC-MM-DDHH:MM:SS。(实际上,XMLSchema期望T作为日期和时间之间的分隔符,目前我不记得为什么。)以这种方式格式化日期和时间的两个主要优点是:以任何其他方式格式化日期是一种残酷的做法。很容易让.NET以这种格式发出DateTime值(使用“s”格式说明符,它代表-等待它-“可排序”)。假设你的日期时间是这种格式2010-06-01T15:16:29+05:00那么最简单的方法是DATETIME我可以只替换我的日期时间格式中的额外字符我有额外的字符(-T:和+)所以只需替换它,那么您的日期时间将采用数字格式并且可以轻松排序我知道这个问题很老,您可能有解决方案,但我想分享我的答案:privatestaticvoidSortElementAttributesBasis(XmlNoderootNode){for(intj=0;j输入的XML是@DimitreNovatchev提供的例子以上是C#学习教程:基于DateTime属性的C#,XPath对XML节点进行排序。分享的全部内容,如果有兴趣,很有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如有转载请注明出处:
