2010-07-27 32 views
6

estoy generando una dinámica sitemap.xmlCómo generar el atributo xsi: schemalocation correctamente al generar un sitemap.xml dinámico con LINQ to XML?

Según sitemaps.org esta es la cabecera de un 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> 

Así que estoy utilizando LINQ to XML para generar el 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(); 

La línea comentada es la que no puedo entender bien.
¿Cómo puedo establecer el atributo "xsi: schemalocation"?

Gracias.

Respuesta

4

Ok, lo entendí bien. Gracias a Mike Caron
Si declaro la XAtrribute (XNamespace.Xmlns + "xsi", ...) entonces funciona

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(); 
+0

Para ser justos, no importa un poco cuál es el identificador del espacio de nombres real. Podría ser "carlosmunoz" para todo lo que importa :) –

+0

Genial, luego usaré "carlosmunoz" –

+0

Hola Carlos, ¿qué devuelve el método 'GetNodes'? Gracias por adelantado. – Ethan

3

no sé LINQ to XML, pero después de un rápido vistazo a la documentación, intente esto:

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

Tenga en cuenta que no estoy estableciendo los atributos xmlns explícitamente. Sospecho que se generan automáticamente. Además, caveat emptor, ya que esto no está probado.

+0

Esto casi funciona pero genera p1 en lugar de: xsi ya que la cadena "xsi "no está establecido en ningún lado. –

Cuestiones relacionadas