如何使用Xml Linq检索多级别的属性值?

时间:2015-01-16 09:09:46

标签: c# xml linq

我有一个像这样的xml:

<?xml version="1.0" encoding="iso-8859-1" ?>
<Menu>
    <Group Flow="Horizontal">
        <Item Text="Basket" >
        <Item Text="Favorites">
        <Item Text="Add" Roles="SuperAdmin">  
                <Item Text="Evaluation"  Roles="Admin">
                </Item>
                <Item Text="Titularisation" Roles="users,Admin">
                </Item>
        </Item>
    </Group>
</Menu>

我希望检索所有属性“角色”

我试过了:

    XElement rootElement = XElement.Load(@"C:\Users\TTM\Desktop\GeneralMenu.xml");
    XElement menuElt = rootElement.Element("Group");
    var itemsAdd = from el in menuElt.Descendants("Item")
                       where (string)el.Attribute("Text") == "Add"
                       select el;
    foreach (var item in itemsAdd)
    {
        Console.WriteLine(item.Attribute("Roles").Value);
    }

    Console.Read();

但我只得到这个应答的“角色”

<Item Text="Add" Roles="SuperAdmin">

1 个答案:

答案 0 :(得分:1)

试试这个: -

XDocument xdoc = XDocument.Load(XMLFile);
var itemAdd = xdoc.Descendants("Item")
                 .Where(x => (string)x.Attribute("Text") == "Add")
                 .Select(x => new
 {
    Roles = (string)x.Attribute("Roles"),
    ChildRoles = x.Descendants("Item")
                   .Select(z => (string)z.Attribute("Roles")).ToList()
 });

在这里,Roles将包含来自父节点的角色,而ChildRoles将包含Text中添加的父级后代中存在的所有角色。

然后,您可以使用foreach循环访问它们: -

foreach (var item in itemAdd)
{
    Console.WriteLine(item.Roles);
    foreach (var childRoles in item.ChildRoles)
    {
        Console.WriteLine(childRoles);
    }
}

如果您希望在单个属性中获取所有角色,则可以像这样获取它: -

Roles = x.Descendants("Item").Select(z => (string)z.Attribute("Roles"))
         .Concat(new List<string> { (string)x.Attribute("Roles") }).ToList()