2010-07-30 105 views
2

我,看起來像這樣一個XML文件的工作:XML LINQ的新手問題

<lfm status="ok"> 
    <user> 
     <name>JohnnyWestlake</name> 
     <image size="large">http://someurl.com/large.jpg</image> 
     <image size="extralarge">ttp://someurl.com/exlarge.jpg</image> 
     ... 
    </user> 
</lfm> 

而且我加入這使用LINQ像這樣用戶等級:

 User user; 

     user = (from lfmUser in userrequest.Descendants("user") 
       select new User 
       { 
        Name = lfmUser.Element("name").Value, 
        ImageM = lfmUser.Element("image").Value, 
        ... 
       }).FirstOrDefault(); 

問題,我如何將ImageM設置爲包含在image size =「extralarge」中的url,而不是image size =「large」?或者我應該以另一種方式去談論它?

回答

3
ImageM = lfmUser.Elements("image") 
       .Where(e => e.Attribute("size").Value == "extralarge") 
+0

我投了你的解決方案,即使它是更好地firstordefault使用,而不是「第一個()」 – frabiacca 2010-07-30 22:54:08

+0

@frabiacca其實我刪除它,但「好」依賴於情況。如果你對任何'Firsting'都要求一個值,那麼使用FirstOrDefault可能不會更好,也許你寧可有例外。 NuclearWinter nw = new ABomb(accessCode.FirstOrDefault()).Detonate(); //現在會發生什麼? – 2010-07-30 23:08:29

+0

@Lucas:我寫了'更好',因爲我認爲如果我必須從我的XML中提取一些文本,我期望輸出中的東西。 如果使用First(),它將在序列不包含任何值時拋出InvalidOperationException。 – frabiacca 2010-07-30 23:21:12

0

試試這個:

var user = (from lfmUser in userrequest.Descendants("user") 
    select new User 
    { 
     Name = lfmUser.Element("name").Value, 
     ImageM = lfmUser.Descendants("image").Where(x=>x.Attribute("size").Value == "large").First().Value 
    }).FirstOrDefault();