【问题标题】:LINQ to XML parsing using attributes使用属性解析 LINQ to XML
【发布时间】:2011-08-29 11:40:45
【问题描述】:

我有一个这样的 xml 文件:

<users>
    <user name="user" password="123" email="test@test.com"/>
</users>

我需要编写代码将属性值复制到对象类型变量中,但我找不到任何适合我需要的东西。我成功编写的部分代码是:

public static UserInfo GetUser()
{
    XDocument users = XDocument.Load(FilePath.UserConfigurationPath);

    UserInfo usersvar = new UserInfo();
}

这里我必须返回对象并将其与文本框值进行比较。

谁能告诉我如何将值复制到对象中?

【问题讨论】:

  • "return d object"——认真的吗? :)
  • @JohnD 不要嘲笑别人的英语水平。
  • 使用 google 和文档,这是一项非常简单的任务。到目前为止,您尝试过什么?
  • @Oskar 不是想嘲讽,听起来更像是他在用“dis”而不是“this”和“d”而不是“the”来使用酷话。也许我弄错了——听起来很有趣。

标签: c# .net xml linq linq-to-xml


【解决方案1】:

解析所有用户:

IEnumerable<UserInfo> GetUsers()
{
    XDocument users = XDocument.Load(path);

    return from u in users.Descendants("user")
           select new UserInfo
           {
               Name = (string)u.Attribute("name"),
               Password = (string)u.Attribute("password"),
               Email = (string)u.Attribute("email")
           };
}

IEnumerable<UserInfo> users = GetUsers();
UserInfo userUser = users.FirstOrDefault(u => u.Name == "user");

如果文档只包含一个用户,或者您想准确解析第一个用户:

XElement userElement = users.Descendants("user").FirstOrDefault();
if (userElement != null)
{
    UserInfo user = new UserInfo
    {
        Name = (string)userElement .Attribute("name"),
        Password = (string)userElement .Attribute("password"),
        Email = (string)userElement .Attribute("email")
    };
}

【讨论】:

  • 在你的类型转换之后那些逗号应该在那里吗?
  • 是的,我想编辑把它们放进去,而你没有注意到它们。无论如何+1
  • 感谢 abatishchev,稍微调整一下代码就可以完美运行。
  • 不要在投影实体后在 FirstOrDefault 中进行过滤,为什么不在投影前的 where 子句中进行过滤。这样一来,您就不会不必要地为物体补水。 IE。如果您有 20 个用户节点并且您的过滤条件与第 19 项匹配,您将创建 19 个 UserInfo 类的实例,然后再找到您想要的。将过滤器放在投影之前将只允许您水合一个 UserInfo 对象。
  • @Tyson:谢谢! :) 在这里见,在 SO。
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多