如何使用LINQ-to-XML从XML中排除NULL块

本文关键字:排除 NULL XML 何使用 LINQ-to-XML | 更新日期: 2023-09-27 18:14:58

考虑这个XML文件。注意,第一个教程有一个Author子元素,而第二个教程没有:

<?xml version="1.0" encoding="utf-8" ?>
<Tutorials>
  <Tutorial>
    <Author>The Tallest</Author>
    <Title>
      WPF Tutorial - Creating A Custom Panel Control
    </Title>
    <Date>2/18/2008</Date>
  </Tutorial>
    <Tutorial>
    <Title>
      2nd WPF Tutorial - Creating A Custom Panel Control
    </Title>
    <Date>2/18/2008</Date>
  </Tutorial>
</Tutorials>

如何使用LINQ-to-XML来加载现有的数据?当进入缺少作者的教程部分时,下面的代码就会崩溃。我不知道如何编写where语句来排除缺少作者的块,或者如何使代码优雅地跳过缺失的数据。我试过了:

where tutorial.Element("Title") != null

但以上没有效果....下面是问题代码:

XDocument xmlDoc = XDocument.Load("C:''xml''2.xml");
var tutorials = from tutorial in xmlDoc.Descendants("Tutorial")
                select new
                {
                    Author = tutorial.Element("Author").Value,
                    Title = tutorial.Element("Title").Value,
                    Date = tutorial.Element("Date").Value,
                };
foreach (var tutorial in tutorials)
{
    Console.WriteLine("author: " + tutorial.Author);
    Console.ReadKey();
}

如何使用LINQ-to-XML从XML中排除NULL块

使用XElement到字符串的转换操作符代替Value属性:

var tutorials = from tutorial in xmlDoc.Root.Elements("Tutorial")
                select new
                {
                    Author = (string)tutorial.Element("Author"),
                    Title = (string)tutorial.Element("Title"),
                    Date = (DateTime)tutorial.Element("Date"),
                };

与其引用可能为null的XElementValue属性,不如显式强制转换为string,如下所示:

Author = (string) tutorial.Element("Author")

查看这篇文章获取更多信息:

  • 使用显式和隐式转换操作符改善LINQ代码气味