2014-09-22 170 views
0

我试图从一个WordPress博客XML饲料的数据,这是XML的格式:http://brockallen.com/category/asp-net/feed/XML的LINQ读取多个节点

var xElements = XElement.Parse(ResponseText); 
var blogs = (from temp in xElements.Elements() 
      select new 
      { 
       Title = temp.Element("item").Element("title").Value, 
       URL = temp.Element("item").Element("link").Value, 
       Image = temp.Element("item").Element("media:content").Value 
      }).FirstOrDefault(); 

如何让他们所有,并将它们存储到一个东西?

media:content错误是说的“:”字符,十六进制值0x3A,不能包含在name.`

当我删除了这一行,就只得到一个,当有更多的,即使删除后FirstOrDefault()

+1

你显式调用'FirstOrDefault'。如果你不只是想要第一个项目,不要那样:) – 2014-09-22 15:19:29

+0

@JonSkeet嗯,我把它拿出来,它的工作原理,但仍然只返回1,当有更多的 – 2014-09-22 15:21:15

+0

'博客'变量只有'[ 0]'= 1结果查看 – 2014-09-22 15:23:50

回答

1

尝试......与命名空间更新的查询content元素

// var xDoc = XDocument.Load(@"<your xml location>"); 
    var xDoc = XDocument.Parse("<your xml string>"); 
    XNamespace ns = "http://search.yahoo.com/mrss/"; 

    var blogs = (from temp in xDoc.Descendants().Elements("item") 
       select new 
       { 
        Title = temp.Element("title").Value, 
        URL = temp.Element("link").Value, 
        Image = temp.Element(ns + "content").Value 
       }); 
+0

这样,您只能获得每个媒体项目的第一个媒体项目标题,虽然你的文档 – 2014-09-22 16:04:58

+0

中有很多文件可以获得所有内容元素,只需使用Image = temp.Elements(ns +“content”)'或者只需要图像url就可以了 - Image = temp .Elements(ns +“content”)。属性(“url”)' – 2014-09-22 16:09:01

2

您正在处理文档的错误级别。 你也需要一个命名空间。

XNamespace media = "http://search.yahoo.com/mrss/"; 
    var items = 
    from channelElement in XElement.Parse(ResponseText).Element("channel").Elements("item") 
    select new { 
    Title = channelElement.Element("title").Value, 
    Url = channelElement.Element("link").Value, 
    MediaItems = (
     from mediaItemElement in channelElement.Elements(media + "content") 
     select new { 
      url = mediaItemElement.Attribute("url").Value, 
      medium = mediaItemElement.Attribute("medium").Value 
      } 
     ).ToList() 
    }; 
+0

是的,这个工程很好。谢谢..除了在我尝试获取'media:content'节点时抛出一个错误:'':'字符,十六进制值0x3A,不能包含在名称中。' – 2014-09-22 15:38:19

+0

@ZeeTee:这是因为它使用*名称空间*带有“媒体”的别名。使用LINQ to XML中的名称空间进行查找。 – 2014-09-22 15:38:52

+0

有没有一种方法可以轻松地将其插入到您的代码中,还是比您的代码更大的任务 – 2014-09-22 15:40:24