使用 XDocument 和 Linq 读取 XML - 检查元素是不是为 NULL?

Posted

技术标签:

【中文标题】使用 XDocument 和 Linq 读取 XML - 检查元素是不是为 NULL?【英文标题】:Reading XML using XDocument & Linq - check if element is NULL?使用 XDocument 和 Linq 读取 XML - 检查元素是否为 NULL? 【发布时间】:2011-02-05 09:06:16 【问题描述】:

我正在使用 LINQ 和 XDocument 来读取 XML 文件。这是代码:

XDocument xml = XDocument.Load(filename);

var q = from b in xml.Descendants("product")
        select new
        
            name = b.Element("name").Value,
            price = b.Element("price").Value,                    
            extra = b.Element("extra1").Value,
            deeplink = b.Element("deepLink").Value                   
        ;

现在的问题是,extra1 字段并不总是存在。 XML 文件中有没有该节点的项目。如果发生这种情况,它会因 NullReferenceException 而崩溃。

是否有可能包含“检查是否为空”以便防止它崩溃?

【问题讨论】:

【参考方案1】:

使用(string) 代替.Value

var q = from b in xml.Descendants("product")
        select new
        
            name = (string)b.Element("name"),
            price = (double?)b.Element("price"),                    
            extra = (string)b.Element("extra1"),
            deeplink = (string)b.Element("deepLink")                   
        ;

这也适用于other datatypes,包括许多可为空的类型,以防元素不总是存在。

【讨论】:

【参考方案2】:

您可以使用“空合并”运算符:

var q = from b in xml.Descendants("product")
        select new
        
            name = (string)b.Element("name") ?? "Default Name",
            price = (double?)b.Element("price") ?? 0.0,                    
            extra = (string)b.Element("extra1") ?? String.Empty,
            deeplink = (string)b.Element("deepLink") ?? String.Empty                   
        ;

这样,您可以完全控制在没有元素时使用的默认值。

【讨论】:

price 必须是 double? 才能使该行有意义。【参考方案3】:

使用以下示例在使用该元素之前检查该元素是否存在。

if( b.Elements("extra1").Any() )

   extra = b.Element("extra1").Value;

【讨论】:

【参考方案4】:

这里是使用 XDocument 读取 XML 文件的示例。

  XDocument objBooksXML = XDocument.Load(Server.MapPath("books.xml"));
    var objBooks = from book in
                   objBooksXML.Descendants("Book")
                   select new  
                                Title = book.Element("Title").Value, 
                                Pages = book.Element("Pages").Value 
                              ;

    Response.Write(String.Format("Total 0 books.", objBooks.Count()));
    gvBooks.DataSource = objBooks;
    gvBooks.DataBind();

【讨论】:

这段代码的问题是,如果“Book”不包含“Title”或“Pages”元素,当尝试从其中任何一个获取 .Value 时,您将抛出空异常。

以上是关于使用 XDocument 和 Linq 读取 XML - 检查元素是不是为 NULL?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Xdocument 和 Linq 解析 xml 字符串

使用 LINQ 查询 XDocument 的最佳方法?

当元素的名称中有冒号时,如何使用 LINQ 查询 XDocument?

如何在构建 XDocument 时执行 LINQ 查询?

使用 XDocument 按属性查找元素

如何使用 Foreach 遍历集合以构建 XDocument?