Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在需要通过两个元素和一个属性进行检查的情况下,如何使复杂的LINQ查询工作?_C#_Xml_Linq - Fatal编程技术网

C# 在需要通过两个元素和一个属性进行检查的情况下,如何使复杂的LINQ查询工作?

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 因为我需要提取其中的许多值,我想要一个函数,在这个函数中

我试图通过从一个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;
    }
但是字符串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;