2013-01-04 57 views
1

xDoc变量加载XML内容,但我无法检索任何信息。这又回到NULL:尝试通过LINQ读取XML属性

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> 

谢谢

回答

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") 
       }; 
+0

我删除.Elements和使用.Descendents它的工作!谢谢! – Max

+0

@Max那你为什么接受错误的答案? –

+1

对不起,只是修好了! – Max

0

见下文。

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

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

感谢您的回复。它返回0,不知道为什么。 – Max

+0

@Max它应该返回1个项目。你确定xml文件没问题吗? – scartag