从 XElement 中删除属性

Posted

技术标签:

【中文标题】从 XElement 中删除属性【英文标题】:Remove attributes from XElement 【发布时间】:2014-07-07 10:38:11 【问题描述】:

请考虑这个 XElement:

<MySerializeClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <F1>1</F1>
    <F2>2</F2>
    <F3>nima</F3>
</MySerializeClass>

我想从上面的 XML 中删除 xmlns:xsixmlns:xsd。 我写了这段代码,但它不起作用:

 XAttribute attr = xml.Attribute("xmlns:xsi");
 attr.Remove();

我收到了这个错误:

附加信息:“:”字符,十六进制值 0x3A,不能包含在名称中。

如何删除以上属性?

【问题讨论】:

相关:***.com/questions/987135/… 【参考方案1】:

我会使用xml.Attributes().Where(a =&gt; a.IsNamespaceDeclaration).Remove()。或者使用xml.Attribute(XNamespace.Xmlns + "xsi").Remove()

【讨论】:

【参考方案2】:

你可以试试下面的

//here I suppose that I'm loading your Xelement from a file :)
 var xml = XElement.Load("tst.xml"); 
 xml.RemoveAttributes();

来自MSDN Removes the attributes of this XElement

【讨论】:

【参考方案3】:

如果您想使用命名空间,LINQ to XML 让这一切变得非常简单:

xml.Attribute(XNamespace.Xmlns + "xsi").Remove();

这里是用于删除所有 XML 命名空间的最终干净且通用的 C# 解决方案:

public static string RemoveAllNamespaces(string xmlDocument)

    XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XDocument.Load(xmlDocument).Root);

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

输出

 <MySerializeClass>
  <F1>1</F1> 
  <F2>2</F2> 
  <F3>nima</F3> 
 </MySerializeClass>

【讨论】:

以上是关于从 XElement 中删除属性的主要内容,如果未能解决你的问题,请参考以下文章

从 XElement 获取子元素 [重复]

C# - 如何从 XElement 中删除 xmlns

从 XElement 读取文本内容

如何从XElement获取标签

如何确定 XElement.Elements() 是不是包含具有特定名称的节点?

c# Elements of elements using XElement