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

时间:2011-11-18 04:42:44

标签: c# linq-to-xml

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

<?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加载存在的数据?下面的代码在进入缺少作者的Tutorial部分时会爆炸。我无法弄清楚如何编写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();
}

2 个答案:

答案 0 :(得分:3)

使用XElement to String conversion operator代替Value property

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"),
                };

答案 1 :(得分:0)

不是引用可能为null的Value的{​​{1}}属性,而是可以执行显式转换为字符串,如下所示:

XElement

查看此文章了解更多信息: