【问题标题】:Accessing and saving XElements in an object collection在对象集合中访问和保存 XElement
【发布时间】:2013-10-31 20:00:02
【问题描述】:

我有以下情况,并希望获得有关该主题的一些帮助指导:

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


XML文件的代码sn-p:

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

我们将不胜感激,如果我从错误的角度看待这个问题,请告诉我是否可以使用其他方法。提前致谢

【问题讨论】:

    标签: c# xml linq xelement


    【解决方案1】:

    您只需要调用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 不会给您留下括号中的查询表达式,这总是看起来有点难看。

    【讨论】:

    • 确定,想澄清一下我没有遗漏什么
    • 这正是我想要的。非常感谢:) 我知道这是我忽略的小东西。我对使用 lambda 表达式仍然有点紧张,因为我对它的工作方式并不完全满意,但我会研究它,因为它确实在视觉上改进了代码。再次,非常感谢。
    • 我很好奇.. 使用 lambda 表达式,您可以添加与 LINQ 相同的条件吗?例如'... where Username = ""'?
    • Wahoo - 我在 Jon Skeet 的帖子上获得了批准的编辑。那肯定有徽章吧?
    • @Harrison:恐怕我已经回滚了你的编辑——你不需要对象初始化器上的()
    【解决方案2】:

    你试过了吗:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多