2010-11-29 89 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