我在C#.NET应用程序中遇到问题,根据每个节点的时间排序XML文档的节点。我认为我的问题是我不知道如何正确构造XPathExpression,它指定了要进行排序的项目。
XML包含有关已运行的批处理作业的信息,包括每个作业的名称,运行状态,启动时间以及结束时间。
我的XML文档采用以下格式:
<results>
<result>
(Info on one job)
</result>
</results>
以下是单个作业的结果节点示例:
<result offset='14'>
<field k='job_name'>
<value h='1'><text>Y_RUNNING_3</text></value>
</field>
<field k='job_did_start'>
<value><text>08-01-2012 04:00:00</text></value>
</field>
</result>
我省略了几个不相关字段的值。每个字段都命名为“field”,并具有使用属性“k”指定的字段的名称。 (我没有设计XML格式。)
在我的代码中,我成功使用XPathDocument和XPathNavigator加载XML文档而不对其进行排序。但是,我需要在“k”属性设置为“job_did_start”的情况下对字段值的节点进行排序。
以下是代码的一部分:
XPathDocument doc = new XPathDocument(strFilepath);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression selectExpression = nav.Compile("/results/result"); // QQQ not sure about this
// XPathExpression sortExpression = nav.Compile("//@k='job_did_start'");
// selectExpression.AddSort(sortExpression, new DateTimeComparer());
foreach (XPathNavigator item in nav.Select(selectExpression))
{
item.MoveToFirstChild();
do
{
**I’ve omitted the code here because it works and probably is not relevant.**
} while (item.MoveToNext());
}
我已经注释掉了设置sortExpression的行,并将sortExpression添加到selectExpression中,因为它们不起作用。
我 THINK 我需要做的就是在设置sortExpression的语句中找出传递给nav.Compile()的字符串的值。
顺便说一句,这是DateTimeComparer,我从网上的其他地方借来的。我在Compare()方法中设置了一个断点,以确认对象x和y不是表示日期的字符串,但这就是他们需要的。
public class DateTimeComparer : IComparer
{
public int Compare(object x, object y)
{
DateTime dt1 = DateTime.Parse(x.ToString());
DateTime dt2 = DateTime.Parse(y.ToString());
return dt1.CompareTo(dt2);
}
}
由于'job_did_start'值可以是空字符串,我可能需要在Compare()方法中考虑这种可能性。
有人可以帮我正确设置排序键吗?
谢谢。
答案 0 :(得分:0)
我明白了。以下作品:
XPathExpression sortExpression = nav.Compile("./field[@k='job_did_start']");