2009-06-28 2 views
2

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

В принципе, функция - с использованием 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) 
    } 

Любая помощь будет ок eciated.

Благодаря

Лука

+0

см. Обновление ... найдено и исправлено ... –

+0

спасибо. – lucamauri

+0

оба меня? (confused ...) –

ответ

3

Если попытаться оценить .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/код ...


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

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

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

+0

Спасибо за вашу помощь, к сожалению, кастинг, по-видимому, не помогает. Я добавил неисправный код. Возможно, я искал ошибку в другом месте? – lucamauri

+0

ЭТО ПРОСТО! Я, вероятно, не обратил на это достаточного внимания. Спасибо вам обоим. – lucamauri

Смежные вопросы