如何通过属性值对linq中的XML文档进行排序?

时间:2011-01-05 12:45:54

标签: c# xml linq sorting windows-phone-7

我试图按属性的值对我的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 for Windows Phone 7。

如果有任何帮助,我将不胜感激。

-

更新

感谢您的快速回复!

juharr问了一个很好的问题......我期待OrderBy会修改data。现在我知道我错了。

我想修改data,我做了如下(感谢Matt Lacey):

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

2 个答案:

答案 0 :(得分: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"));

(在手机上测试也确认。)

答案 1 :(得分:1)

我希望这有助于你

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

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

不要忘记为people使用ToArray()方法。