使用LINQ在XML文件中搜索2个不同的元素
本文关键字:2个 元素 搜索 LINQ XML 文件 使用 | 更新日期: 2023-09-27 18:04:51
我想使用下面的linq搜索,但要修改它,以便它也会搜索用户和管理员。
NAME
, ID
和PASS
是用来比较的字符串。如果这三个都匹配,那么程序就知道它是什么类型的用户,管理员还是用户,并从那里开始操作。否则,他不在任何列表中,并显示一个错误。
XElement xelement = XElement.Load(@"c:'user.xml");
IEnumerable<XElement> users = xelement.Elements();
foreach (var user in users)
{
if((user.Element("Id").Value==ID)&&(user.Element("Username").Value==NAME)&&(user.Element("Password").Value==PASS))
}
xml文件是这样构建的:
<Data>
<UserList>
<User Id="123" Username="abc" Password="abc123"></User>
</UserList>
<AdminList>
<Admin Id="123" Username="abc" Password="abc123"></Admin>
</AdminList>
</Data>
您当前的代码使用LINQ到XML类,但您实际上没有使用任何LINQ查询。
你可以做的是:
-
分别获取admin和users
XDocument xDoc = XDocument.Load(@"c:'user.xml"); var admins = xDoc.Root.Element("AdminList").Elements("Admin"); var users = xDoc.Root.Element("UserList").Elements("User");
-
将它们连接在一起:
var adminsAndUsers = admins.Select(x => new { Element = x, Type = "Admin" }) .Concat(users.Select(x => new { Element = x, Type = "User" }));
-
查找匹配用户的查询结果集合。我使用
(string)XAttribute
casting而不是XAttribute.Value
属性,因为它使用更安全(当属性不存在时不会抛出异常)。var user = adminsAndUsers.FirstOrDefault( x => (string)x.Element.Attribute("Id") == ID && (string)x.Element.Attribute("Username") == NAME && (string)x.Element.Attribute("Password") == PASS);
-
查询结果
if(user != null) { // user is there var type = user.Type; } else { // no user matches }
试试这个方案
结构 public struct test
{
public bool isStudent;
public string id;
public string Username;
public string Password;
}
List<test> users = doc.Descendants("User").Where(e => e.Attribute("Id").Value == "123").Select(e => new test{ isStudent = true, id = e.Attribute("Id").Value, Username = e.Attribute("Username").Value, Password = e.Attribute("Username").Value }).ToList();
List<test> admins = doc.Descendants("Admin").Where(e => e.Attribute("Id").Value == "123").Select(e => new test { isStudent = false, id = e.Attribute("Id").Value, Username = e.Attribute("Username").Value, Password = e.Attribute("Username").Value }).ToList();
List<test> allTogether = users.Concat(admins).ToList();
foreach (var xElement in allTogether)
{
//check if xElement property isStudent is true
}
现在在allTogether列表中,你可以检查你需要的每一个属性