代码之家  ›  专栏  ›  技术社区  ›  Carlos Muñoz Boom

使用linq to xml生成动态sitemap.xml时,如何正确生成xsi:schemaLocation属性?

  •  6
  • Carlos Muñoz Boom  · 技术社区  · 14 年前

    我正在生成动态sitemap.xml

    根据 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”属性?

    谢谢。

    2 回复  |  直到 9 年前
        1
  •  4
  •   Carlos Muñoz Boom    14 年前

    好吧,我说得对。感谢迈克·卡伦
    如果我声明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(); 
    
        2
  •  3
  •   Mike Caron    14 年前

    我不知道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属性。我怀疑它们是自动生成的。另外,注意清空器,因为这没有测试。

    推荐文章