XDocument.Descendants(itemName) - 查找限定名称的问题

时间:2010-10-13 13:40:36

标签: c# linq-to-xml qualified-name xname

我正在尝试从网站上阅读XML-RSS-Feed。因此,我使用异步下载并使用XDocument方法创建XDocument.Parse()

该文件旨在非常简单,如下:

<root>
  <someAttribute></SomeAttribute>
  <item>...</item>
  <item>...</item>
</root>

现在我想读出所有项目。所以我试过了:

foreach (XElement NewsEntry in xDocument.Descendants("item"))

但这不起作用。所以我在这个板子里发现了一个使用限定名称的帖子,因为根元素中定义了一些名称空间:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns="http://purl.org/rss/1.0/">

好吧,我尝试了所有3个可用的命名空间 - 对我没有任何作用:

XName itemName = XName.Get("item", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
XName itemName2 = XName.Get("item", "http://purl.org/dc/elements/1.1/");
XName itemName3 = XName.Get("item", "http://purl.org/rss/1.0/modules/syndication/");

任何帮助将不胜感激。 (通常我正在使用Regex进行XML分析 - 但这次我正在为移动设备开发,因此需要关注性能。)

3 个答案:

答案 0 :(得分:4)

您尚未在rdf声明的末尾尝试default namespace

xmlns="http://purl.org/rss/1.0/"

这是有道理的,因为默认命名空间中的任何元素都不需要在元素名称前加上命名空间。

答案 1 :(得分:2)

不直接解决XDocument RSS读取问题。但是,为什么不使用提供的SyncdicationFeed类来加载Feed? http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx

答案 2 :(得分:0)

试试这个

var elements = from p in xDocument.Root.Elements()
where p.Name.LocalName == "item"
select p;

foreach(var element in elements)
{
//Do stuff
}