【问题标题】:How to check if XML contains element when using LINQ to XML?使用 LINQ to XML 时如何检查 XML 是否包含元素?
【发布时间】:2023-03-06 09:13:01
【问题描述】:

鉴于此结构:

 <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 元素是否存在,如果存在,读取它?

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    您当前的代码无法编译,因为您正在尝试将 XElement 分配给字符串属性。我的猜测是您正在使用 XElement.Value 属性将其转换为字符串。取而代之的是,使用显式字符串转换,如果您将其称为“on” null 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();
    

    【讨论】:

      【解决方案2】:

      试试下面的代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多