Linq to Xml: Generate Google Sitemap with sitemap-protocol

In this example I will generate a XML site-map that complies with the sitemap-protocol XML schema.

[code language=’c#’]
//create datasource

List blogPosts = new List{
 “http://blog.newguid.net/mypost1.aspx”,
 “http://blog.newguid.net/mypost_about_Net.aspx”,
 “http://blog.newguid.net/morePosts.aspx”,
 “http://blog.newguid.net/andEvenMorePosts.aspx”
};

//Create namespace for sitemap-protocol

XNamespace xmlNS = “http://www.sitemaps.org/schemas/sitemap/0.9”;
XDocument xmlDoc =
 new XDocument(
  new XDeclaration(“1.0”, “UTF-8”, null),
  new XElement(xmlNS + “urlset”,
   from blogPostUrl in blogPosts
   select
    new XElement(xmlNS + “url”,
    new XElement(xmlNS + “loc”, blogPostUrl))
    ));

//Show output

Response.Write(xmlDoc);

[/code]

This example will give the following output:

[code language=’xml’]
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9“>
 
    http://blog.newguid.net/mypost1.aspx
 
 
    http://blog.newguid.net/mypost_about_Net.aspx
 
 
    http://blog.newguid.net/morePosts.aspx
 
 
    http://blog.newguid.net/andEvenMorePosts.aspx
 

[/code]

To keep the example as simple as possible I only use the LOC element of the URL node. In the real world you can implement the lastmod, changefreq and priority node.

More information about the sitemap-protocol.

Convert XmlElement to XElement (Extension Method)

I was using some web-services that returned there values in an XmlElement. I needed to convert this XmlElement to something that I can use with LINQ. I didn't find good solutions on the internet. So I started building my own convert logic. After all kinds of solutions I ended up with creating an new XmlDocument, adding the XmlElement to the XmlDocument and then convert the innerXml of the XmlDocument to an XElement. Not really nice but it does the trick.

I've rewritten the code into a Extension Method for the XmlElement.

[code:c#]

public static XElement ToXElement(this XmlElement xml)
{
   XmlDocument doc = new XmlDocument();

   doc.AppendChild(doc.ImportNode(xml, true));

   return XElement.Parse(doc.InnerXml);

}

[/code]


You use the Extension Method like this:

[code:c#]

XmlElement xmlElement = wsClient.DoWebServiceRequest();
XElement xml = xmlElement.ToXElement();

[/code]


Please tell me if you have a better way of doing this!

Cheers,
Pieter