Xml Linq 查询(通过属性和属性值获取元素)

Xml Linq Query (get Element by Attribute and Attribute value)

我有以下 xml 文件:

<Object type="User">
    <Attribute name="Name">usernameExample</Attribute>
    <Attribute name="Title">FHen</Attribute>
    <Attribute name="AdministratedBy">Admin</Attribute>
    <Attribute name="Password">123</Attribute>
    <Attribute name="TimeOut">00:20:00</Attribute>
    <Object type="AreasFolder">
        <Attribute name="Name">Areas</Attribute>
        <Attribute name="Comment">This folder contains ...</Attribute>
        <Object type="Area">
            <Attribute name="Name">RootArea</Attribute>
            <Attribute name="AccessLevel">None</Attribute>
        </Object>
        <Object type="Area">
            <Attribute name="Name">FRF</Attribute>
            <Attribute name="AccessLevel">Admin</Attribute>
        </Object>
    </Object>
</Object>

我的目标是通过用户名获取具有 AccessLevel != None 的区域的名称。我已经可以获取用户内部的区域,并且可以使用 C# 逻辑过滤它们,但我想使用 Linq Xml 查询来做到这一点。

现在我做了以下事情:

我主要是:

logic.tryXdoc("usernameExample");

在我的 Logic.cs:

public void tryXdoc(string username)
    {
        List<string> lista = new List<string>();

        XElement ConfigData = XElement.Load(UsersXmlPath);

        XElement scadaUsers =
            (from xElement in ConfigData.Elements("Object")
                 //where (string)xElement.Element("type") == "User"
             select xElement).First();

        XElement usersFolder =
            (from xElement in scadaUsers.Elements("Object")
             where (string)xElement.Attribute("type") == "UsersFolder"
             select xElement).First();

        IEnumerable<XElement> users =
             from xElement in usersFolder.Elements("Object")
             where (string)xElement.Attribute("type") == "User"
             select xElement;

        XElement user =
             (from xElement in users
              where (string)xElement.Element("Attribute").Attribute("name") == "Name"
              && (string)xElement.Element("Attribute") == username
              select xElement).First();

        XElement areasFolder =
             (from xElement in user.Elements("Object")
              where (string)xElement.Attribute("type") == "AreasFolder"
              select xElement).First();

        IEnumerable<XElement> areas =
             from xElement in areasFolder.Elements("Object")
             where (string)xElement.Attribute("type") == "Area"
             select xElement;        
    }

现在,我想要这样的东西:

        IEnumerable<XElement> visibleAreas =
             from xElement in areas.Elements("Attribute")
             where 
             (string)xElement.Attribute("name") == "AccessLevel"
             && (string)xElement.Attribute("name").Value != "None"
             select xElement;

我只想得到一个 Area,因为只有一个 AccessLevel != "None" 但我得到的结果与 areas 相同。我不知道如何告诉我的程序我希望它与 "None" 比较的 xElement.Attribute("name").Value 它是 xElement.Attribute("name") 我与 AccessLevel 进行了比较。

我已经尝试使用 Descendants().Where( something ) 但我得到了同样的结果。我尝试使用 Descendants().Where(something.Where( something else )) 但我无法编译。

我可以得到我想要使用的区域:

        List<List<XElement>> listAreaAttributes = new List<List<XElement>>();

        foreach (XElement xElement in areas)
        {
            List<XElement> areaAttributes = new List<XElement>();

            foreach (XElement xEl in xElement.Elements("Attribute"))
            {
                areaAttributes.Add(xEl);
            }

            listAreaAttributes.Add(areaAttributes);
        }

然后比较 areaAttributes 但我知道可以通过查询来实现,所以我不想使用处理来实现。

如果您想在每个用户的基础上进行修改以适合您的用户,如何?这假定您的 XML 的顺序是准确的,并且 AccessLevel 名称始终是紧接在 AccessLevel 之前的节点。

List<string> visibleAreas = ConfigData.Descendants("Attribute")
    .Where(x => x.Attribute("name").Value == "AccessLevel")
    .Where(x => x.Value != "None")
    .Select(x => ((XElement)x.PreviousNode).Value)
    .ToList();