2011-01-05 49 views
2

我試圖通過屬性的值來排序我的xml文件,但沒有運氣。如何使用屬性值對linq中的XML文檔進行排序?

data.Descendants("person").OrderBy(x => x.Attribute("id").Value); 

數據包含:

<persons> 
    <person id="1"> 
    <name>Abra</name> 
    <age>25</age> 
    </person> 
    <person id="2"> 
    <name>Cadabra</name> 
    <age>29</age> 
    </person> 
    <person id="4"> 
    <name>Hokus</name> 
    <age>40</age> 
    </person> 
    <person id="3"> 
    <name>Pokus</name> 
    <age>30</age> 
    </person> 
</persons> 

給出here回答沒有爲我工作。

我使用MVS 2010爲Windows Phone 7的

我會感謝任何幫助。

-

更新

感謝您的快速反應!

juharr問了一個很好的問題...我期待OrderBy會修改data。現在我知道我錯了。

我想修改data,我已經做了如下(感謝馬特·萊西):

var people = data.Elements("person").OrderBy(p => (string)p.Attribute("id")); 

    data.Descendants("person").Remove(); 
    data.Element("persons").Add(people); 

,但我仍然一無所獲。 Data是空的,它只包含<persons />

我想知道現在有什麼問題。


我設法通過使用此代碼來解決我的問題:

XDocument datatemp = new XDocument(data); 

    var people = datatemp.Descendants("person").OrderBy(x => (int)int.Parse(x.Attribute("id").Value)); 

    data.Descendants("person").Remove(); 
    data.Element("persons").Add(people); 

是任何其他方式(更優雅)修改data使用OrderBy而不是創建datatemp

+1

你能更具體地說「不幸」嗎? – fejesjoco 2011-01-05 12:47:40

+2

您是在捕獲'OrderBy'的結果,還是期望修改'data'? – juharr 2011-01-05 13:24:37

+0

我知道這是一個古老的問題。但是,如Dima所說,通過添加.ToList()或.ToArray()來避免數據變量變量。 'stuff.OrderBy(...)。ToList()'在添加到人員時阻止IEnumerable爲空。 – Mixxiphoid 2014-04-02 16:48:27

回答

1

根據您鏈接到的問題,這個工程:

var people = from p in data.Elements("person") 
      orderby (string)p.Attribute("id") 
      select p; 

var people = data.Elements("person").OrderBy(p => (string)p.Attribute("id")); 

(在手機上測試,以確認過。)

+0

這將按int.sort的string.sort進行排序? – 2013-10-25 15:56:40

1

我希望這可以幫助你

var people = data.Elements("person").OrderBy(p => (string)p.Attribute("id")).ToArray(); 

data.Descendants("person").Remove(); 
data.Element("persons").Add(people); 

不要爲爲你的people使用ToArray()方法。

相關問題