2011-07-28 53 views
0

我試圖爲文檔系統的XML文件添加排序,包括日期修改條目。Xpath表達式Addsort方法

基本上我有一個gridview來顯示所有文檔列表的XML,並且在顯示之前我正在對數據運行addsort。

每個文件都有一個標籤,包含true或false,然後是發佈日期(這些是完整的文檔,因此不需要修改),當文檔被修改時,標籤一旦完成就被更改爲true它在標籤上發佈了一個日期。

對於客戶需要的正確順序是修改日期 - >修改日期 - >修改標籤爲false的訂單。

目前,我有按標題排序:

 StringReader str = new StringReader(PLCDocsXML.InnerXml); 
     XPathDocument doc = new XPathDocument(str); 
     XPathNavigator navigator2 = PLCDocsXML.CreateNavigator(); 
     XPathExpression subselectExpression = navigator2.Compile(XpathExpr); 
     if (asc) 
     { 
      subselectExpression.AddSort("title", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text); 
     } 

的XML是這樣的:

<result> 
     <document> 
      <title>Title</title> 
      <otherstuff /> 
      <modified>[true/false]<modified> #those with true first before false 
      <publishdate /> #if not got a publish date 
      <publishdate>2009-10-16</publishDate> 
     </document> 
    </result> 

所以我需要的順序是:

 <result> 
     <document> 
      <title>Title1</title> 
      <otherstuff /> 
      <modified>true<modified> 
      <publishdate /> 
     </document> 
     <document> 
      <title>Title4</title> 
      <otherstuff /> 
      <modified>true<modified> 
      <publishdate>2010-11-27</publishDate> 
     </document> 
     <document> 
      <title>Title2</title> 
      <otherstuff /> 
      <modified>true<modified> 
      <publishdate>2009-10-16</publishDate> 
     </document> 
     <document> 
      <title>Title3</title> 
      <otherstuff /> 
      <modified>false<modified> 
      <publishdate /> 
     </document> 
    </result> 

感謝您的幫助你可以給

回答

0

我結束了這個固定我自己(我不能讓kirills編譯,有人抱怨沒有concat方法)

的方法是使用XPath選擇分離出所有不同類型的物品,然後在對它們進行迭代之前對它們進行單獨歸類,就好像它們是單個物品一樣,爲我工作

0

試試這個:

var navigator = doc.CreateNavigator(); 
var subselectTrueExpression = navigator 
    .Compile(@"//document[normalize-space(modified) = 'true']"); 
var subselectFalseExpression = navigator 
    .Compile(@"//document[normalize-space(modified) = 'false']"); 

var nodes = navigator.Select(subselectTrueExpression).Cast<XPathNavigator>() 
    .Concat(
     navigator.Select(subselectFalseExpression).Cast<XPathNavigator>() 
    );