2010-11-29 88 views
5

鑑於這種結構:如何在使用LINQ to XML時檢查XML是否包含元素?

<root> 
    <user> 
      <userName>user1</userName> 
      <userImageLocation>/user1.png</userImageLocation> 
    </user> 
    <user> 
      <userName>user2</userName> 
    </user> 
</root> 

public class User 
{ 
    public string UserName {get; set; } 
    public string UserImageLocation {get; set; } 
} 

我使用的LINQ to XML從XML文件中獲取數據,如:

XDocument document = XDocument.Parse(xmlFile); 
List<User> listOfUsers = 
(from user in document.Descendants("user") 
select new User { 
    UserName = user.Element("userName"), 
    UserImageLocation = user.Element("userImageLocation"), 
} 
).ToList<User>(); 

我的問題是,並非所有的用戶元素包含userImageLocation,和當試圖讀取userImageLocation時,它會拋出一個異常。

如何檢查XML元素是否存在,如果存在,請閱讀它?

回答

7

您當前的代碼不會編譯,因爲您試圖將XElement分配給字符串屬性。我的猜測是,您正在使用XElement.Value屬性將其轉換爲字符串。取而代之的是,使用顯式字符串轉換,如果你把它稱爲「上」空XElement參考,這將返回null:

XDocument document = XDocument.Parse(xmlFile); 
List<User> listOfUsers = 
(from user in document.Descendants("user") 
select new User { 
    UserName = (string) user.Element("userName"), 
    UserImageLocation = (string) user.Element("userImageLocation"), 
} 
).ToList<User>(); 

請注意,這是使用點符號這是相當更具可讀性的情況之一:

XDocument document = XDocument.Parse(xmlFile); 
List<User> listOfUsers = document 
    .Descendants("user") 
    .Select(user => new User { 
     UserName = (string) user.Element("userName"), 
     UserImageLocation = (string) user.Element("userImageLocation") }) 
    .ToList(); 
3

試試下面的代碼

UserImageLocation = user.Element("userImageLocation")!=null?user.Element("userImageLocation").Value:string.Empty