У меня есть структура 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>
Я пытаюсь найти способ сортировки узлов на основе атрибута sTime, который является значением 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, я сортирую узлы XML на основе атрибута sTime, а затем получаю все атрибуты в соответствующие массивы, которые будут использоваться позже.
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++;
}