2013-01-04 146 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