私はこのようなXML構造を持っています。
<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>
DateTime.ToString()値であるsTime属性に基づいてノードをSORTする方法を見つけようとしています。秘訣は、ノードを無傷に保つ必要があり、何らかの理由でそれを行う方法を見つけることができないことです。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ノードを並べ替えて、後で使用するためにすべての属性を適切な配列に取得する方法です。
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++;
}