使用Linq查询Atom命名空间

时间:2015-09-18 08:14:04

标签: c# xml linq

这是我的示例xml文件:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
            <title>Title goes here</title>
            <author><name>None</name></author>
            <source>
                <title>Adhocs Source - Adhocs Section</title>
                <id>None</id>
                <updated>2015-07-21T17:45:20.387248Z</updated>
            </source>
            <link rel="alternate" href="http://www.example.com/" />
            <id>http://www.example.com/</id>
            <updated>2015-07-21T17:45:20.387248Z</updated>
            <published>2015-07-21T17:45:20.387248Z</published>
            <summary>sample desc goes here...</summary>
            <media:thumbnail
             xmlns:media="http://search.yahoo.com/mrss/"
             url="http://mscrmblog.net/wp-content/uploads/2013/10/iframe-loading.png"  />
        </entry>
</feed>

当我尝试使用下面的代码使用c#Linq读取XML查询:

XElement _atom = XElement.Load(atom);
XNamespace nsMedia = "http://search.yahoo.com/mrss/";
XNamespace nsAtom = "http://www.w3.org/2005/Atom";

var temp = (from item in _atom.Descendants(nsAtom + "entry")
                        select new FinalListToBeDisplayed()
                        {
                            Title = item.Element(nsAtom + "title") == null ? "" : item.Element(nsAtom + "title").Value,
                            Description = item.Element(nsAtom + "summary") == null ? "" : item.Element(nsAtom + "summary").Value,
                            PublishedDate = item.Element(nsAtom + "published") == null ? "" : item.Element(nsAtom + "published").Value,
                            Link = item.Element(nsAtom + "link") == null ? "" : item.Element(nsAtom + "link").Attribute("href") == null ? "" : item.Element(nsAtom + "link").Attribute("href").Value,
                            Image = item.Element(nsMedia + "thumbnail") == null ? "" : item.Element(nsMedia + "thumbnail").Attribute(nsAtom + "url") != null ? item.Element(nsMedia + "thumbnail").Attribute(nsAtom + "url").Value : ""

                        }).ToList();

图像在任何时刻都没有捕获,即上面的代码无法读取缩略图。请帮我理解上面代码中的问题。

2 个答案:

答案 0 :(得分:1)

试试这个

XElement _atom = XElement.Load(atom);
        XNamespace nsMedia = "http://search.yahoo.com/mrss/";
        XNamespace nsAtom = "http://www.w3.org/2005/Atom";

        var temp = (from item in _atom.Descendants(nsAtom + "entry")
                    select new 
                    {
                        Title = item.Element(nsAtom + "title") == null ? "" : item.Element(nsAtom + "title").Value,
                        Description = item.Element(nsAtom + "summary") == null ? "" : item.Element(nsAtom + "summary").Value,
                        PublishedDate = item.Element(nsAtom + "published") == null ? "" : item.Element(nsAtom + "published").Value,
                        Link = item.Element(nsAtom + "link") == null ? "" : item.Element(nsAtom + "link").Attribute("href") == null ? "" : item.Element(nsAtom + "link").Attribute("href").Value,
                        Image = item.Element(nsMedia + "thumbnail") == null ? "" : item.Element(nsMedia + "thumbnail").Attribute("url") != null ? item.Element(nsMedia + "thumbnail").Attribute("url").Value : ""                           

                    }).ToList();

答案 1 :(得分:0)

问题是url的属性名称。 url没有命名空间,但您将http://www.w3.org/2005/Atom命名空间作为名称的一部分。删除它并使用url它将起作用。

我还评论说,您可以使用返回序列的方法以及XElementXAttribute中内置的显式转换来避免您的空检查。这实现了相同的结果,但更清洁:

Title = (string)item.Element(nsAtom + "title") ?? "",

Description = (string)item.Element(nsAtom + "summary") ?? "",

PublishedDate = (string)item.Element(nsAtom + "published") ?? "",

Link = (string)item.Elements(nsAtom + "link")
    .Attributes("href")
    .SingleOrDefault() ?? "",

Image = (string)item.Elements(nsMedia + "thumbnail")
    .Attributes("url")
    .SingleOrDefault() ?? ""