Linq to Xml : 删除命名空间

Linq to Xml : Remove namespace

我正在从我的 xml 文档中检索元素或节点。一切顺利,但是当我检索节点时,它被分配了我根的命名空间。这个我不要我只想要之前的节点(没有命名空间)。

我检索的元素是例如x元素。 我试过了

  1. xElement.Attributes("xmlns").Remove();
  2. xElement.Attributes("xmlns").Where(x=>x.IsNamespaceDeclaration).Remove();

None 人成功了。

我什至试过这个例子:https://social.msdn.microsoft.com/Forums/en-US/9e6f77ad-9a7b-46c5-97ed-6ce9b5954e79/how-do-i-remove-a-namespace-from-an-xelement?forum=xmlandnetfx这左边遇到了一个带有空命名空间的元素xmlns=""

请帮忙

如前所述here

Based on interface:

string RemoveAllNamespaces(string xmlDocument);

I represent here final clean and universal C# solution for removing XML namespaces:

//Implemented based on interface, not part of algorithm
public static string RemoveAllNamespaces(string xmlDocument)
{
    XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(xmlDocument));

    return xmlDocumentWithoutNs.ToString();
}

//Core recursion function
 private static XElement RemoveAllNamespaces(XElement xmlDocument)
    {
        if (!xmlDocument.HasElements)
        {
            XElement xElement = new XElement(xmlDocument.Name.LocalName);
            xElement.Value = xmlDocument.Value;

            foreach (XAttribute attribute in xmlDocument.Attributes())
                xElement.Add(attribute);

            return xElement;
        }
        return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el)));
    }

以上方案还有两个flase

  • 它忽略属性
  • 不适用于 "mixed mode" 个元素

这是另一个解决方案:

 public static XElement RemoveAllNamespaces(XElement e)
 {
    return new XElement(e.Name.LocalName,
      (from n in e.Nodes()
        select ((n is XElement) ? RemoveAllNamespaces(n as XElement) : n)),
          (e.HasAttributes) ? 
            (from a in e.Attributes() 
               where (!a.IsNamespaceDeclaration)  
               select new XAttribute(a.Name.LocalName, a.Value)) : null);
  }          

示例代码 here