如何使用c#解析xml链接标记href属性

时间:2013-12-12 07:13:45

标签: c# xml windows-phone-8 rss

这是Feed项的示例xml

 <item>
   <pubDate>2013-12-11 10:28:55</pubDate>
   <title>
     SAG Awards Nominations: 12 Years a Slave, Breaking Bad lead the race
   </title>
   <link>
     http://www.rottentomatoes.com/m/1929182/news/1929182/
   </link>
   <description>
   <![CDATA[ ]]>
   </description>
   <atom:link rel="thumbnail" type="image/*"  href="http://content6.flixster.com/movie/11/17/36/11173600_tmb.jpg"/>
  </item>

用于解析xml元素的c#代码

 List<XElement> elementsList = xmlItems.Descendants("item").ToList();
 foreach (XElement rssItem in elementsList)
 {
    RSSItem rss = new RSSItem();
    rss.Description1 = rssItem.Element("description").Value;
    rss.Link1 = rssItem.Element("link").Value;
    rss.Title1 = rssItem.Element("title").Value;
    rss.ImageUrl= ;
 }

我成功解析了除atom:link标记网址之外的xml元素 我们如何解析atom:link标签中的href属性?

2 个答案:

答案 0 :(得分:1)

Link有一个名称空间,您需要在解析XML时指明它。我不记得究竟是什么命名空间atom,但它应该在XML文件中的某个位置指示(通常在根节点上)。例如,如果是:

<feed xmlns:atom="http://www.w3.org/2005/Atom">

然后你需要像这样解析它:

rss.Link1 = (string)rssItem.Element(XName.Get("link", "http://www.w3.org/2005/Atom")).Attribute("href");

答案 1 :(得分:1)

您需要在查找元素时指定命名空间:

XNamespace atom = "http://www.w3.org/2005/Atom";
...
rss.Link1 = rssItem.Element(atom + "link").Attribute("href").Value;

LINQ to XML使命名空间处理 比我见过的任何其他XML API更简单,但您仍需要了解它。 (说实话,我很惊讶其他元素不在命名空间中。)

我还将您的foreach循环转换为LINQ查询:

var items = xmlItems.Descendants("item")
                    .Select(x => new RSSItem {
                         Description1 = x.Element("description").Value,
                         Link1 = x.Element(atom + "link").Attribute("href").Value,
                         Title1 = x.Element("title").Value,
                         ...
                     })
                    .ToList();

另外考虑使用强制转换为string而不是Value属性,如果某些元素可能丢失 - 这会将相关属性设置为null,而不是抛出{{1} }。

编辑:如果缺少NullReferenceException元素,您可以使用以下命令解决此问题:

link

这将在原子Link1 = (string) x.Elements(atom + "link").Attributes("href").FirstOrDefault() 元素中找到第一个href属性,或使用null - 如果没有属性,则转换为link只会返回string 。 (这是用户定义的从nullXAttribute的转换的一部分。)