访问和保存对象集合中的XElements

时间:2013-10-31 20:00:02

标签: c# xml linq xelement

我有以下情况,并希望就该主题提供一些帮助指导:

对于简单的聊天应用程序,我有一个由用户凭据组成的XML文件(非商业用途,因此在这种情况下安全性没有任何意义)。如果用户订阅了该服务,则其凭据应与XML文件中记录的凭据相匹配。


XML文件的代码段:

<Users>
 <User>
  <Username>Johan</Username>
  <Password>Johan123</Password>
 </User>
 <User>
  <Username>Carel</Username>
  <Password>Carel123</Password>
 </User>
  ...
  ...
</Users>

然后我有以下课程:

public class Credentials
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }

Credentials类仅用于检索XML文件中记录的用户列表,以及检索特定用户。

我有以下代码可以从XML文件中检索元素:

public List<Credentials> RetrieveUsers()
        {
            Root = XElement.Load(path + "Users.xml");
            List<Credentials> credentials = new List<Credentials>();

            var xmlResults = from element in Root.Elements().Elements()
                     select new 
                     {
                           Username = element.Element("Username").Value,
                           Password = element.Element("Password").Value
                     };

            foreach(var xmlResult in xmlResults)
            {
                Credentials temp = new Credentials();

                temp.Username = xmlResult.Username;
                temp.Password = xmlResult.Password;

                credentials.Add(temp);
            }

            return credentials;
        }

然而,这感觉多余。我希望在以下方面取得一些成果(这不起作用):

public List<Credentials> RetrieveUsers()
        {
            Root = XElement.Load(path + "Users.xml");
            List<Credentials> credentials = new List<Credentials>();

            List<Credentials> xmlResults = from element in Root.Elements().Elements()
                select new 
                {
                       Username = element.Element("Username").Value,
                       Password = element.Element("Password").Value
                };
            return xmlResults;
        }

它给了我以下错误:

“无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.List'。存在显式转换(您是否错过了转换?)”

这非常有意义,因为我认为它使用IEnumerable来枚举select LINQ语句所产生的集合。

任何有关此事的帮助都会受到赞赏,请告诉我,如果我从错误的角度看这个问题,我是否可以使用其他方法。提前致谢

2 个答案:

答案 0 :(得分:5)

您只需调用ToList扩展方法即可创建列表。此外,您需要创建Credentials个对象而不是匿名类型的实例。例如:

var xmlResults = from element in Root.Elements().Elements()
                 select new Credentials
                 {
                     Username = element.Element("Username").Value,
                     Password = element.Element("Password").Value
                 };
return xmlResults.ToList();

我个人不倾向于使用查询表达式来处理简单的/ select查询 - 我写过:

return Root.Elements().Elements() // TODO: Consider specifying the element name
           .Select(element => new Credentials
                   {
                     Username = element.Element("Username").Value,
                     Password = element.Element("Password").Value
                   })
           .ToList();

使用“点符号”这样的优点是调用ToList不会在括号中留下查询表达式,这看起来总是有点难看。

答案 1 :(得分:1)

你试过这个:

        List<Credentials> xmlResults = Root.Elements().Elements()
            .Select(element => new Credential() {
                   Username = element.Element("Username").Value,
                   Password = element.Element("Password").Value
            })
            .ToList();