尝试通过LINQ读取XML属性

时间:2013-01-04 22:40:43

标签: c# xml linq

xDoc变量加载XML内容但我无法检索任何信息。它回来了NULL:

var xDoc = XDocument.Load(Config.CredentialFileName);

//method 1
IEnumerable<XElement> rows = from row in xDoc.Descendants("domain")
                             where (string)row.Attribute("name") == "TEST"
                             select row;
//method 2
var list = xDoc.Descendants("domain")
    .Select(d => new
    {
        name = d.Attribute("name").Value,
        username = d.Attribute("username").Value,
        password = d.Attribute("password").Value //,
    })
    .Where(a => a.name == "TEST")
    .ToList();

XML文件:

<domains>
  <domain name="TEST" userName="test" password="tSEvmlsmwEkjSxUwrCVf3G6"/>
</domains>

谢谢

2 个答案:

答案 0 :(得分:1)

您使用的xml可以很好地使用第一种方法。确保使用完全相同的结构解析xml。还要检查您是否至少有一个名称等于TEST的域元素。并确保您没有在xml中定义名称空间。

第二种方法在userName属性名称中有拼写错误(您有小写username):

var list = xDoc.Descendants("domain")
                .Select(d => new {
                    name = d.Attribute("name").Value,
                    username = d.Attribute("userName").Value, // <-- typo here
                    password = d.Attribute("password").Value
                })
                .Where(a => a.name == "TEST")
                .ToList();

另外,我建议使用强制转换而不是读取节点Value属性,因为如果节点不存在,获取此属性将抛出异常。

var domains = from d in xDoc.Descendants("domain")
              let name = (string)d.Attribute("name")
              where name == "TEST"
              select new {
                  Name = name,
                  Username = (string)d.Attribute("userName"),
                  Password = (string)d.Attribute("password")
              };

答案 1 :(得分:0)

见下文。

  var xDoc= XElement.Load(Config.CredentialFileName);             

var result =  xDoc.Elements("domain").Where(x => x.Attribute("name").Value.Equals("TEST")).ToList();