我有以下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”,但是我得到的结果与Area相同。我不知道如何告诉我的程序我希望将其与“无”进行比较的xElement.Attribute(“ name”)。Value与我与AccessLevel进行比较的xElement.Attribute(“ name”)的值。
我已经尝试使用Descendants()。Where(something),但是我得到了相同的结果。我试图使用Descendants()。Where(something.Where(other someness)),但我无法编译。
我可以获得想要使用的区域:
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();