0

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

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

谢谢你。

4

1 回答 1

0

我想到了。以下作品:

XPathExpression sortExpression = nav.Compile("./field[@k='job_did_start']"); 
于 2012-09-05T05:50:02.557 回答