LINQ to XML, когда узел не существует - PullRequest
2 голосов
/ 28 июня 2009

Я писал общий класс для чтения RSS-каналов из различных источников и объединения в одну коллекцию объектов в VB.net.

По сути, функция - использование LINQ to XML - работает правильно, но у меня есть проблема, когда лента RSS, которую я пытаюсь прочитать, не содержит ни одного узла (как вы знаете, многие из них являются необязательными). Я хотел бы, чтобы возвращаемое значение было пустой строкой или ничего, но вместо этого я получаю обратно ошибку времени выполнения. Я искал в интернете ту же проблему и обнаружил этот пост http://forums.asp.net/p/1351226/2762834.aspx#2762834, который, очевидно, объясняет обходной путь, но он не работает с моим кодом.

Меня также удивляют небольшие ресурсы, которые я нахожу по этой проблеме, поэтому мне интересно, если я даже поставлю вопрос в правильных терминах ...

После вы можете найти код:

Dim PostsEnum = From BlogPost In XMLSource.Descendants("item")
    Order By DateTime.Parse(BlogPost.Element("pubDate").Value) Descending
    Select New Post() With {
        .Title = BlogPost.Element("title").Value,
        .Link = BlogPost.Element("link").Value,
        .Description = BlogPost.Element("description").Value,
        .AuthorText = BlogPost.Element("author").Value,
        .Category = (From tag In BlogPost.Descendants("category")
            Select cat = tag.FirstNode.ToString).ToList,
        .PubDate = DateTime.Parse(BlogPost.Element("pubDate").Value),
        .GUID = BlogPost.Element("guid").Value
     }

Я попробовал это на http://neatlydoc.codeplex.com/Project/ProjectRss.aspx, и это сработало, но следующий код сгенерирует исключение:

Dim PostsEnum = From BlogPost In XMLSource.Descendants("item")
    Order By DateTime.Parse(BlogPost.Element("pubDate").Value) Descending
    Select New Post() With {
        .Title = BlogPost.Element("title").Value,
        .Link = BlogPost.Element("link").Value,
        .Description = BlogPost.Element("description").Value,
        .AuthorText = BlogPost.Element("author").Value,
        .Category = (From tag In BlogPost.Descendants("category")
             Select cat = tag.FirstNode.ToString).ToList,
        .PubDate = DateTime.Parse(BlogPost.Element("pubDate").Value),
        .GUID = BlogPost.Element("guid").Value,
        .Source = CType(BlogPost.Element("source").Value, String)
    }

Любая помощь будет оценена.

Спасибо

Luca

1 Ответ

3 голосов
/ 28 июня 2009

Если вы попытаетесь оценить .Value (и т. Д.) - тогда да, он сломается - однако вы можете попробовать приведение (apols, но мой пример - C # - вам придется представить VB):

    select new {
      Name = (string)el.Element("abc")
      ...
    }

Оператор явного статического преобразования принимает нулевые узлы и возвращает нулевые значения соответствующим образом. Для более сложных сценариев, просто проверьте это:

      let child = el.Element("SomeChild")
      select new {
         Name = child == null ? (string)null : (string)child.Attribute("Name")
         ...
      }

Трудно быть более конкретным без примера xml / code ...


Редактировать повторно ваше обновление; проблема в том, что вы все еще читаете .Value; измените его на:

.Source = CType(BlogPost.Element("source"), String)

Есть оператор преобразования из XElement в string; вам не нужно смотреть на .Value.

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