当节点不存在时LINQ to XML

时间:2009-06-28 10:23:04

标签: xml vb.net linq rss linq-to-xml

我正在编写一个通用类,用于从各种源读取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)
    }

任何帮助将不胜感激。

由于

卢卡

1 个答案:

答案 0 :(得分: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 / code,很难更具体......


编辑您的更新;问题是你还在阅读.Value;将其更改为:

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

XElementstring有一个转换运算符;你不需要看.Value