2010-07-27 78 views
6

我生成一个动态的sitemap.xml如何在使用LINQ to XML生成动态sitemap.xml时正确生成xsi:schemalocation属性?

根据sitemaps.org这是一个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> 

所以我使用LINQ to XML生成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(); 

评论线是我不能正确的。
如何设置“xsi:schemalocation”属性?

谢谢。

回答

4

好吧,我说得对。感谢Mike卡隆
如果我宣布XAtrribute(XNamespace.Xmlns + “XSI”,...),那么它的工作原理

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

公平地说,实际的名称空间标识符并不重要。它可能是“carlosmunoz”的所有重要的:) – 2010-07-27 19:22:36

+0

很酷,然后我会使用“carlosmunoz” – 2010-07-27 19:24:07

+0

嘿卡洛斯,'GetNodes'方法返回什么?提前致谢。 – Ethan 2010-08-24 15:25:25

3

我不知道的LINQ to XML,但在文档快速浏览一下之后,试试这个:

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

请注意,我没有设定明确的xmlns属性。我怀疑他们是自动生成的。此外,警告空手,因为这没有测试。

+0

这几乎工程,但它产生:P1代替:XSI因为字符串“XSI “没有设置在任何地方。 – 2010-07-27 18:55:56