这是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属性?
答案 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
。 (这是用户定义的从null
到XAttribute
的转换的一部分。)