2012-09-04 25 views
0

我在C#.NET應用程序中根據每個節點中的時間排序XML文檔的節點時遇到問題。我認爲我的問題是,我不知道如何正確構建指定要在其上執行排序的項目的XPathExpression。我需要一些幫助,指定要在我的XPathExpression AddSort()方法調用中使用的排序鍵

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> 

我爲幾個不相關的字段省略的值。每個字段都被命名爲「字段」並具有使用屬性「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,因爲他們沒有工作線。

I 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」值可以是一個空字符串,我可能需要考慮的比較()方法的可能性。

那麼有人可以幫我正確設置排序鍵嗎?

謝謝。

回答

0

我想通了。以下作品:

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