XElement属性排序

4

我有一个类似于这样的XML文件:

<Users>
    <User>
        <Adress Name="bbbb"/>
        <Adress Name="aaaa" />
    </User>
</Users>

我希望能将User元素的节点按升序排序。如何对Address元素进行排序?

感谢您的帮助。


1
"Adress" 是一个打字错误。如果您的文件实际上是这样的,可能需要修复它。 - Merlyn Morgan-Graham
2个回答

9
如果node是您的用户节点:
node.Elements("Adress").OrderBy(e=>e.Attribute("Name").Value)

3
你只想在内存中操作XML对象,还是想将排序后的结果存储回文件中?这段代码展示了如何重新排序XDocument中的元素,以便于保存。
string xml = @"<Users> 
<User> 
<Address Name=""bbbb""/> 
<Address Name=""aaaa"" /> 
</User> 
<User> 
<Address Name=""dddd""/> 
<Address Name=""cccc"" /> 
</User> 
</Users> ";

XDocument document = XDocument.Parse(xml);

var users = document.Root.Elements("User");
foreach (var user in users)
{
    var elements = user.Elements("Address").OrderBy(a => a.Attribute("Name").Value).ToArray();
    user.Elements().Remove();
    user.Add(elements);
}

如果您想要一个有序的内存模型,那么可以像这样实现:
var query = from user in document.Root.Elements("User")
            select new
            {
                Addresses = from address in user.Elements("Address")
                            orderby address.Attribute("Name").Value
                            select new
                            {
                                Name = address.Attribute("Name").Value 
                            }
            };

foreach (var user in query)
{
    foreach (var address in user.Addresses)
    {
        // do something with address.Name
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接