【问题标题】:How to remove xmlns attribute from XDocument?如何从 XDocument 中删除 xmlns 属性?
【发布时间】:2011-08-09 22:51:58
【问题描述】:

在我的 C# 代码库中,我有一个 XDocument 的形式:

<A>
 <B>
   <C xmlns='blabla' yz='blablaaa'> Hi </C>
   <D xmlns='blabla' yz='blablaaa'> How </D>
   <E xmlns='blabla' yz='blablaaa'> Are </E>
   <F xmlns='blabla' yz='blablaaa'> You </F>
 </B>
 <B>
   <C xmlns='blabla' yz='blablaaa'> I </C>
   <D xmlns='blabla' yz='blablaaa'> am</D>
   <E xmlns='blabla' yz='blablaaa'> fine</E>
    <F xmlns='blabla' yz='blablaaa'> thanks</F>
 </B>

使用 Linq-to-XML 或其他方式,我想删除元素 B 包含的所有元素的 xmlns

使用此处给出的方法:How to Remove specific attributes in XMLDocument?,我能够删除所有属性除了 xmlns

XDocument 中删除“xmlns”属性的最佳方法是什么?

【问题讨论】:

  • 为什么要这样做?这些不是正常的属性。他们定义了命名空间。
  • 这不是重复的。并且接受的答案比“可能的”副本所声称的要干净得多。

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


【解决方案1】:

在 LINQ to XML 中表示 XML 文档的对象树中似乎将命名空间信息保存在两个位置:作为实际的 xmlns 属性和元素的 Names 内。如果你从这两个地方删除它,它就消失了:

doc.Descendants()
   .Attributes()
   .Where( x => x.IsNamespaceDeclaration )
   .Remove();

foreach (var elem in doc.Descendants())
    elem.Name = elem.Name.LocalName;

(上面代码的第一部分是从 Bertrand Marron 现在删除的答案中复制的。)

如果您也想从属性中删除命名空间,那会稍微复杂一些,因为它们的 Name 是只读的:

foreach (var attr in doc.Descendants().Attributes())
{
    var elem = attr.Parent;
    attr.Remove();
    elem.Add(new XAttribute(attr.Name.LocalName, attr.Value));
}

【讨论】:

  • 所以实际上XmlDocument 类没有.Descendants() 成员。我的猜测是这段代码是针对XDocument 类的,这不是 OP 所要求的。
  • @supertopi 这个问题明确要求 LINQ to XML,这就是这个答案所使用的。但是,是的,这意味着它是 XDocument,而不是 XmlDocument
  • 好吧,标题有点误导:)我会建议修改
  • 您可以轻松键入 cast xmlDocument to xDocument 以应用 LINQ
  • public static class DocumentExtensions { public static XmlDocument ToXmlDocument(this XDocument xDocument) { var xmlDocument = new XmlDocument();使用(var xmlReader = xDocument.CreateReader()) { xmlDocument.Load(xmlReader); } 返回xml文档; } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多