我试图通过从XML文件中查找登录信息来获取LINQ查询,其中父文件具有类型的属性,并且我想要它们下面的元素的值。所以没有XML标签,我所拥有的是:
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;
}
我希望根据我发送的内容返回Test或Test2类型的用户名,然后返回登录的el.Value。我似乎无法获得正确的语法来获取值。我也尝试过:
Assert.IsNotNullOrEmpty(type);
XElement root = XElement.Load("TestInformation.xml");
string username = (string)
(from el in root.Elements("Username")
where (string)el.Attribute("Type") == type
select el.Element("Login"));
return username;
但字符串username =(string)line给出了有关无法将XElement转换为字符串的错误。如果只是想获得第一次登录我可以使用root.Descendents来做,但我希望能够按类型调出我想要的任何登录名。
这可行吗?
答案 0 :(得分:2)
在这两种情况下,您都试图将IEnumerable转换为字符串。尝试使用.First来获取第一个Login元素:
string username = root.Elements("Username")
.First(el => (string)el.Attribute("type") == type)
.Element("Login")
.Value;
还有一件需要注意的事情。在您的示例中,您使用属性上的大写T(“类型”),但它在XML中使用较低的。像C#这样的XML区分大小写。