使用LINQ to XML时如何检查XML是否包含元素?

时间:2010-11-29 08:10:32

标签: c# xml linq

鉴于这种结构:

 <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>();

我的问题是并非所有user元素都包含userImageLocation,并且在尝试读取userImageLocation时,它会抛出异常。

如何检查XML元素是否存在,如果存在,请阅读它吗?

2 个答案:

答案 0 :(得分:8)

您正在尝试将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();

答案 1 :(得分:3)

尝试以下代码

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