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

5

考虑到以下结构:

 <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),当尝试读取用户图像位置时,会抛出异常。

我该如何检查XML元素是否存在,如果存在,如何读取它?

2个回答

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

3
请尝试以下代码。
UserImageLocation = user.Element("userImageLocation")!=null?user.Element("userImageLocation").Value:string.Empty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接