.NET i takie tam

WordPress 2 Object

leave a comment »

Chwila zabawy z LINQ 2 XML i proszę mamy posty z WordPress’a w postaci obiektowej. Metoda:

public IEnumerable<Post> GetAllPosts()
{
    var posts = from item in _xml.Descendants("channel").Descendants("item")
                where item.Element(_wp.GetName("post_type")).Value == "post"
                select new Post()
                {
                    Title = item.Element("title").Value,
                    Url = item.Element("link").Value,
                    Autor = item.Element(_dc.GetName("creator")).Value,
                    Categories = (from t in item.Descendants("category")
                                  where t.Attributes().Count() == 2 && t.Attribute("domain").Value == "category"
                                  select GetCategory(t.Value)).ToList(),
                    Tags = (from t in item.Descendants("category")
                            where t.Attributes().Count() == 2 && t.Attribute("domain").Value == "tag"
                            select t.Value).ToList(),
                    DateCreated = DateTime.Parse(item.Element(_wp.GetName("post_date")).Value),
                    Content = item.Element(_content.GetName("encoded")).Value,
                    Status = item.Element(_wp.GetName("status")).Value,
                    Comments = (from c in item.Elements(_wp.GetName("comment"))
                                where c.Element(_wp.GetName("comment_approved")).Value == "1"
                                select new Comment()
                                {
                                    Autor = c.Element(_wp.GetName("comment_author")).Value,
                                    EMail = c.Element(_wp.GetName("comment_author_email")).Value,
                                    Url = c.Element(_wp.GetName("comment_author_url")).Value,
                                    DateCreated = DateTime.Parse(c.Element(_wp.GetName("comment_date")).Value),
                                    Content = c.Element(_wp.GetName("comment_content")).Value,
                                }).ToList()
                };

    return posts;
}

jak nazwa wskazuje pobiera wszystkie posty z pliku *.xml będącym kopią bezpieczeństwa wyeksportowaną z WordPress’a. Jednakże zanim, standardowo wygenerowany plik, będzie można załadować do obiektu XElement musimy, ręcznie, dodać jeden brakujący namespace. Mianowicie w tag’u:

<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:wp="http://wordpress.org/export/1.0/"
>

musimy dodać atrybut:

xmlns:excerpt="http://wordpress.org/excerpt/1.0"

Teraz wszystko śmiga. Inna rzecz na którą warto zwrócić uwagę to sposób odczytu znaczników, np.:

<content:encoded> ...</content:encoded>

Próba bezpośredniego odczytu wartości, przykładowo:

item.Element("content:encoded").Value;

spowoduje wygenerowanie XmlException: The ‚:’ character, hexadecimal value 0x3A, cannot be included in a name. Aby pobrać tą wartość musimy się odwołać do wcześniej wymienionego namespace’u, następująco:

XNamespace _wp = @"http://wordpress.org/export/1.0/";

item.Element(_wp.GetName("cat_name")).Value;

Kod źródłowy: download.

Written by sakowicz

Listopad 10, 2008 @ 11:00 am

Napisane w .NET, Tools

Tagged with , , , ,

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: