【发布时间】:2010-09-25 13:49:27
【问题描述】:
我有一个看起来像这样的 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 类,这就是我如何根据 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++;
}
【问题讨论】:
-
你可以添加另一个属性,这是时间的可排序版本吗?刻度或 YYYYMMDD
-
我正在使用 Web 服务,我打电话给管理员让他们将排序添加到存储过程中,但如果我无法获得它们,我必须尝试使用现有的 XML 格式找到解决方案。不过建议很好。
-
所有这些答案都以不同的方式起作用。多谢你们。所有这些都很有用。
-
为什么,除了简单的无知,还有人会编写一个 Web 服务来发出没有要符合的架构的 XML 吗?这就像编写一个 API,然后用便利贴记录它。