C# 在需要通过两个元素和一个属性进行检查的情况下,如何使复杂的LINQ查询工作?
我试图通过从一个XML文件中查找登录信息来实现LINQ查询,该文件的父级有一个类型为的属性,我需要它们下面的元素值。因此,如果没有XML标记,我得到的是:C# 在需要通过两个元素和一个属性进行检查的情况下,如何使复杂的LINQ查询工作?,c#,xml,linq,C#,Xml,Linq,我试图通过从一个XML文件中查找登录信息来实现LINQ查询,该文件的父级有一个类型为的属性,我需要它们下面的元素值。因此,如果没有XML标记,我得到的是: Users Username type=Test Login testuser1 Password password Username type=Test2 Login testuser2 Password password 因为我需要提取其中的许多值,我想要一个函数,在这个函数中
Users
Username type=Test
Login testuser1
Password password
Username type=Test2
Login testuser2
Password password
因为我需要提取其中的许多值,我想要一个函数,在这个函数中我可以给它一个类型标记,并返回正确的登录名值,我尝试了几种不同的方法,但没有让LINQ做我想要的事情。我可能遗漏了一些东西,但我正在尝试使用微软的例子,以及其他一些例子,但我还没有找到与我尝试使用的例子完全相同的东西。我通过示例和测试学习得最好,到目前为止,我还没有找到任何正确的方法
我尝试了两种不同的版本:
public string getTestUserInfo(string type)
{
Assert.IsNotNullOrEmpty(type);
XElement root = XElement.Load("TestInformation.xml");
IEnumerable<XElement> myusername =
from el in root.Elements("Username")
where (string)el.Attribute("Type") == type
select el.Element("Login");
string username = myusername.ToString();
return username;
}
但是字符串username=(string)行给出了关于无法将XElement转换为字符串的错误。如果只是想获得第一个登录名,我可以使用root.degents来完成,但我希望能够通过键入来调用我想要的任何登录名
这可行吗?在这两种情况下,您都试图将IEnumerable转换为字符串。尝试使用.First获取第一个登录元素:
string username = root.Elements("Username")
.First(el => (string)el.Attribute("type") == type)
.Element("Login")
.Value;
还有一件事需要注意。在您的示例中,在属性(“Type”)上使用大写的T,但在XML中它的大小写较低。像C#这样的XML是区分大小写的。非常酷,我不知道你能这样写。我尝试了这个例子,在root.Elements(“Username”)的行中,我得到:Sequence不包含匹配的元素。我对错误消息不太熟悉,不知道哪里出了问题。该错误表明其中一个步骤没有返回任何结果,因此无法正确评估以下方法。尝试通过检查每个方法来测试,以确保它们返回您期望的结果。另外,确保没有忘记提及的XML名称空间,因为没有返回结果的LINQ to XML错误中有95%是由查询中缺少名称空间声明引起的。第三,确保XML源中的
UserName
和Login
实际上是大写的。我没有意识到在XML中增加一个级别会有所不同,这是我第一次真正使用LINQ,但我最终将root.Elements切换为root.substants,这就解决了这个问题。非常感谢,如果没有帮助,我想我不会走这么远……而且我在学习这些东西方面还有很长的路要走!是的,这就是元素和后代之间的区别。元素指的是树下的一个级别,而后代指的是当前节点下的任何节点。如果您在学习LINQ方面需要更多帮助,我可以推荐一本好书;-)请这样做,增加阅读清单是没有坏处的。谢谢
string username = root.Elements("Username")
.First(el => (string)el.Attribute("type") == type)
.Element("Login")
.Value;