我需要一些帮助来指定在我的XPathExpression AddSort()方法调用中使用的排序键

时间:2012-09-04 22:27:33

标签: c# .net xml-parsing

我在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()方法中考虑这种可能性。

有人可以帮我正确设置排序键吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我明白了。以下作品:

XPathExpression sortExpression = nav.Compile("./field[@k='job_did_start']");