Search code examples
c#linq-to-xmlsitemap.xml

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.


Solution

  • 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();