如何在需要通过两个元素和属性检查的地方使用复杂的LINQ查询?

时间:2011-10-12 18:51:44

标签: c# xml linq

我试图通过从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来做,但我希望能够按类型调出我想要的任何登录名。

这可行吗?

1 个答案:

答案 0 :(得分:2)

在这两种情况下,您都试图将IEnumerable转换为字符串。尝试使用.First来获取第一个Login元素:

string username = root.Elements("Username")
                      .First(el => (string)el.Attribute("type") == type)
                      .Element("Login")
                      .Value;

还有一件需要注意的事情。在您的示例中,您使用属性上的大写T(“类型”),但它在XML中使用较低的。像C#这样的XML区分大小写。