Как исключить блоки NULL из XML с помощью LINQ-to-XML? - PullRequest
2 голосов
/ 18 ноября 2011

Рассмотрим этот 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 для загрузки имеющихся данных?Приведенный ниже код взрывается, когда он попадает в раздел 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 ]

3 голосов
/ 18 ноября 2011

Используйте Оператор преобразования XElement в строку вместо Значение :

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"),
                };
0 голосов
/ 18 ноября 2011

Вместо ссылки на Value свойство XElement, которое может быть нулевым, вы можете вместо этого сделать явное приведение к строке, например:

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

Проверьте эту статью для получения дополнительной информации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...