我的 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 的行,因为它们不起作用。
我想我需要做的就是找出在设置 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() 方法中考虑这种可能性。
那么有人可以帮我正确设置排序键吗?
谢谢你。