2012-03-19 36 views
0

我試圖以各種不同的順序打印文檔。現在我有一組打印對象和一個XML文檔,每個節點的屬性都與集合中的打印對象相關聯。我想通過基於這些屬性對XML文檔進行排序來對這些對象進行排序。XML排序選項C#.Net

現在我正在使用一系列的集合,我騎自行車並根據需要完成的排序將節點添加到新集合中。問題是3或4種,它變得混亂。我確信必須有更好的方法來排序這個打印對象的集合,使用XML或不使用XML。

這裏有一些屬性,我的XML有我正在整理上:

  • 郵編對文件所列
  • 的文檔

沒有人有

  • 名稱#一個更好的主意?

    感謝,

    編輯 -

    我的文件看起來像

    <xml> 
    <claim key="1" att1="wd" att2="de"/> 
    <claim key="2" att1="wd" att2="de"/> 
    <claim key="3" att1="wd" att2="de"/> 
    <claim key="4" att1="wd" att2="de"/> 
    </xml> 
    

    鍵值與打印對象集合中的一個點相關聯。索賠節點可能有更多的子節點,但我不認爲這是相關的。我只希望能夠根據屬性進行排序,至少會有3個屬性,但可能會添加更多屬性。此外,這需要多功能,所以如果我需要切換排序順序,它應該很容易重新排列。一旦我按照正確的順序獲得了XML,然後我通過XML使用一個循環,以便將該鍵放入一個列表中,然後通過該列表中的鍵打印出Print對象。

    感謝,

  • +0

    您可以發佈該文件的一個例子,你是如何連接的XML節點打印對象,請?這將有很大的幫助。 – deadlyvices 2012-03-19 13:08:55

    +2

    我會建議可能有一些LINQ與一些分組和排序會幫助你,但是我們必須看看XML看起來像給你什麼具體的例子。 [這是一篇文章](http://stackoverflow.com/questions/5013710/linq-order-by-group-by-and-order-by-each-group)讓你知道我在說什麼。 – 2012-03-19 13:11:11

    回答

    1

    我在LINQPad試過了這個例子出來,似乎做什麼你問。

    var root = XDocument.Parse("<xml><claim>...</claim></xml>").Element("xml"); 
    
    var query = from claim in root.Elements("claim") 
          let key = claim.Attributes("key").First().Value 
          let att1 = claim.Attributes("att1").First().Value 
          let att2 = claim.Attributes("att2").First().Value 
          orderby key, att1, att2 
          select claim; 
    

    它發現<claim>節點在你的XML,選擇在您希望進行排序的屬性,對其進行排序,然後返回一個IEnumerable<XElement>收集代表排序<claim>節點。

    然後,您可以使用query結果建立你Print對象,或者你可以改變上面有它爲你做它:

    var query2 = from claim in root.Elements("claim") 
          let key = claim.Attributes("key").First().Value 
          let att1 = claim.Attributes("att1").First().Value 
          let att2 = claim.Attributes("att2").First().Value 
          orderby key, att1, att2 
          select new Print { 
             Property1 = key, // do type conversion if needed 
             Property2 = att1, 
             Property3 = att2 
            }; 
    

    我覺得它適合你所提到的可維護性的要求 - 你只需要改變添加/刪除/更改LINQ查詢中的屬性名稱,如果你需要不同的排序。

    編輯:拿到鑰匙進入int個列表,如下面的評論:

    var printKeys = (from claim in query 
           select Integer.Parse(claim.Attributes("key").First().Value)).ToList(); 
    
    +0

    這看起來像它將適用於我所需要的,我唯一的問題是,因爲我對c#有點新,所以我如何循環訪問IEnumerable 集合,以便我可以將Key值放入一個ints列表中。我不會按鍵排序,關鍵只是讓我找出打印obj集合中的哪個位置來打印。 – kds6253 2012-03-19 13:50:25

    +0

    @ kds6253:我更新了我的答案。 – 2012-03-19 13:54:17

    +0

    謝謝,我現在正在使用它。你有沒有建議閱讀XDocument和你使用的solutuon。我想更多地閱讀它,這個解決方案比我最初想到的要簡單100倍,我想知道這種解決方案可以用在哪裏。 – kds6253 2012-03-19 13:57:29