我正在编写一个通用类,用于从各种源读取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)
}
任何帮助将不胜感激。
由于
卢卡
答案 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)
从XElement
到string
有一个转换运算符;你不需要看.Value
。