c# - 在对象集合中访问和保存 XElement

标签 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>

然后我有以下类(class):

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 语句创建的集合。

如有任何帮助,我们将不胜感激,如果我从错误的角度看待这个问题,请告诉我是否可以使用另一种方法。提前致谢

最佳答案

您只需要调用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();

就我个人而言,我不倾向于将查询表达式用于简单的 from/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 不会在括号中留下查询表达式,这看起来总是有点难看。

关于c# - 在对象集合中访问和保存 XElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19715572/

相关文章:

C#嵌套foreach循环优化

asp.net - 使用 ASP.NET 如何从网站读取外部 XML?

regex - 根据标签中的值从日志中提取多行 XML

ASP.Net 网页堆叠 xml 文档而不是并排显示,CSS 问题?

linq - OData "where ID in list"查询

C# LINQ 按错误排序

c# - C# 使用表达式树生成分组后带有求和的 select 语句

c# - 这个c#方法有什么问题?

c# - xml节点实际上不是节点,需要获取属性

c# - 如果输入命令,如何在保留旧文本的同时添加新文本?