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

时间:2012-12-02 18:49:45

标签: c# xml linq linq-to-xml

我遇到有关生成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网址元素包含xmlns=""属性。

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

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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( );
}

答案 1 :(得分:-1)

试试此代码

XmlDocument stripDocumentNamespace(XmlDocument oldDom)
{
    XmlDocument newDom = new XmlDocument();
    newDom.LoadXml(Regex.Replace(oldDom.OuterXml,
         @"(xmlns:?[^=]*=[""][^""]*[""])", "",
         RegexOptions.IgnoreCase | RegexOptions.Multiline));
    return newDom;
}