2009-06-28 13 views
2

さまざまなソースからRSSフィードを読み取り、VB.netのオブジェクトの1つのコレクションに統合するための汎用クラスを作成していました。ノードが存在しない場合の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) 
    } 

すべてのヘルプはAPPRになりますeciated。

おかげ

ルカ

+0

更新を参照...見つけて固定... –

+0

ありがとうございました。 – lucamauri

+0

私はどちらですか? (混乱して...) –

答えて

3

あなたが.Valueの(など)を評価しようとした場合 - [はい、それは中断します - しかし、あなたはapols(キャストしてみてくださいかもしれないが、私の例では、C#で - あなた'LL

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

明示的静的変換演算子はヌルノードを受け入れ、適切にヌルを返します。より複雑なシナリオの場合は、ちょうどそれをテスト:サンプルXML /コードなしで、より具体的であることが

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

は、ハード...


編集は、あなたの更新を再度;問題はあなたがまだ.Valueを読んでいることです。以下のように変更します。

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

XElementstringへの変換演算子があります。 .Valueを見る必要はありません。

+0

あなたの助けてくれてありがとう、残念なことに、キャスティングは明らかに助けにはならない。私は欠陥のあるコードを追加しました。 おそらく、間違った場所でエラーを探していますか? – lucamauri

+0

それは簡単! 私はおそらくそれに十分な注意を払っていませんでした。 お互いに感謝します。 – lucamauri

関連する問題