XDocument读取带命名空间的RSS Feed元素返回null如何解决
问题修复方案
核心问题说明
你当前的命名空间拼接逻辑本身是正确的,content:encoded节点返回null主要是两个常见原因:
- 部分
item节点可能不存在content:encoded子节点,你直接调用.Value会触发空引用异常,被外层catch捕获后直接返回false,容易误认为是节点获取逻辑错误 - 你当前的代码在处理完第一个RSS源后就直接在循环内
return true,后续RSS源不会被处理,也会干扰问题排查
修复后的核心代码
首先修改节点取值逻辑,增加空值防护,避免空引用异常:
XNamespace nsSys = "http://purl.org/rss/1.0/modules/content/"; var entries = (from item in doc.Descendants("item") select new Movie_News { // 增加空值判断,节点不存在时赋值为空字符串 Content = item.Element(nsSys + "encoded")?.Value ?? string.Empty, Link = item.Element("link")?.Value ?? string.Empty, PublishedDate = item.Element("pubDate")?.Value ?? string.Empty, Title = item.Element("title")?.Value ?? string.Empty, Description = item.Element("description")?.Value ?? string.Empty, GroupName = "News", FeedName = pair.Value });
其次将foreach循环内部的return true移到循环结束之后,避免只处理第一个RSS源就终止执行。
可选排查方案
如果修改后依然无法获取节点,可以先输出当前XML的所有命名空间,确认命名空间URI拼写完全匹配:
// 调试用,打印XML中声明的所有命名空间 var allNamespaces = doc.Root.DescendantsAndSelf() .SelectMany(x => x.Attributes()) .Where(a => a.IsNamespaceDeclaration) .Distinct() .ToList();
内容的提问来源于stack exchange,提问作者Kevin Deery
相关产品推荐
相关产品推荐

