使用 LINQ 生成 XML 时从元素中删除 xmlns 属性?

问题描述 投票:0回答:3

我在生成时遇到问题

sitemap.xml

我的创作者代码是这样的:

XNamespace xmlns = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9");
XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
XNamespace schemaLocation = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");

XElement urlset = new XElement(xmlns+"urlset",
                  new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                  new XAttribute(xsi + "schemaLocation", schemaLocation));       

urlset.Add(new XElement("url"));

此代码生成 xml 文件,但生成的

sitemap.xml
url 元素包含
xmlns=""
属性。

<urlset xmlns="..." ><url xmlns=""/> </urlset>

所有

<url>
元素都包含
xmlns = ""
属性。

我该如何解决这个问题?

c# xml linq linq-to-xml
3个回答
0
投票

我认为 W3 Org 可以比我更好地总结命名空间,您拥有“url”节点上方的所有节点和属性的限定命名空间。当你添加

urlset.Add(new XElement("url"));
时,它应该如何确定它所在的命名空间?

我建议您尝试一下,看看它对您有何作用:

static void Main ( string [] args )
{
    XNamespace xmlns = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9");
    XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
    XNamespace schemaLocation = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");

    XElement urlset = new XElement(xmlns+"urlset",
               new XAttribute(XNamespace.Xmlns + "xsi", xsi),
               new XAttribute(xsi + "schemaLocation", schemaLocation));       

    urlset.Add(new XElement(xmlns+"url")); // NB> We are qualifying the node
    var s = urlset.ToString( );
    Console.ReadKey( );
}

0
投票

所有元素都包含

xmlns = ""
属性。这解决了我的问题

public ActionResult Index()
{
  // Create Sitemap
  XNamespace xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9";
  var sitemapXml = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"),
      new XElement( xmlns + "urlset", new XAttribute("xmlns", xmlns),
          from url in pageUrls
          select
          new XElement(xmlns + "url",
              new XElement(xmlns + "loc",  url),
              new XElement(xmlns + "lastmod", DateTime.Now.ToString("yyyy-MM-dd")),
              new XElement(xmlns + "changefreq", "daily"),
              new XElement(xmlns + "priority", "0.8")
          )
      )
  );
  return Content(sitemapXml.ToString(), "application/xml");
}

结果:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://sabricihan.com/</loc>
    <lastmod>2023-09-12</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://sabricihan.com/Home/Contact</loc>
    <lastmod>2023-09-12</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://sabricihan.com/Blog</loc>
    <lastmod>2023-09-12</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

-1
投票

试试这个代码

XmlDocument stripDocumentNamespace(XmlDocument oldDom)
{
    XmlDocument newDom = new XmlDocument();
    newDom.LoadXml(Regex.Replace(oldDom.OuterXml,
         @"(xmlns:?[^=]*=[""][^""]*[""])", "",
         RegexOptions.IgnoreCase | RegexOptions.Multiline));
    return newDom;
} 
© www.soinside.com 2019 - 2024. All rights reserved.