Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate xsi:schemalocation attribute correctly when generating a dynamic sitemap.xml with LINQ to XML?

I am generating a dynamic sitemap.xml

According to sitemaps.org this is the header for a sitemap.xml

<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
     xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
    ...
    </url>
</urlset>

So I'm using LINQ To XML to generate the sitemap.xml

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9";
return new XElement(ns + "urlset",
    new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"),
    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
    //new XAttribute("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"),
    from node in new GetNodes()
    select new XElement(ns + "url",
        new XElement(ns + "loc", node.Loc),
        new XElement(ns + "lastmod", node.LastMod),
        new XElement(ns + "priority", node.Priority)
    )
).ToString();

The commented line is the one i cannot get right.
How can i set the "xsi:schemalocation" attribute?

Thanks.

like image 963
Carlos Muñoz Avatar asked Jul 27 '10 18:07

Carlos Muñoz


2 Answers

Ok, I got it right. Thanks to Mike Caron
If I declare the XAtrribute(XNamespace.Xmlns + "xsi",...) then it works

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
return new XElement(ns + "urlset",  
    new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"),
    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
    new XAttribute(xsi + "schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"),
    from node in GetNodes() 
    select new XElement(ns + "url", 
        new XElement(ns + "loc", node.Loc), 
        new XElement(ns + "lastmod", node.LastMod), 
        new XElement(ns + "priority", node.Priority) 
    ) 
).ToString(); 
like image 145
Carlos Muñoz Avatar answered Sep 29 '22 18:09

Carlos Muñoz


I don't know LINQ to XML, but after a quick peek at the documentation, try this:

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
return new XElement(ns + "urlset",
    new XAttribute(xsi + "schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"),
    from node in new GetNodes()
    select new XElement(ns + "url",
        new XElement(ns + "loc", node.Loc),
        new XElement(ns + "lastmod", node.LastMod),
        new XElement(ns + "priority", node.Priority)
    )
).ToString();

Note that I'm not setting the xmlns attributes explicitly. I suspect they're generated automatically. Also, caveat emptor, since this is not tested.

like image 34
Mike Caron Avatar answered Sep 29 '22 17:09

Mike Caron