Как удалить атрибут xmlns из XDocument?

в моей кодовой базе 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 или иначе, я хотел удалить xmlns для всех элементов, содержащихся в элементе B.

используя методологию, приведенную здесь:Как удалить определенные атрибуты в XMLDocument?, я смог удалить все атрибуты за исключением xmlns

каков наилучший способ удалить атрибут "xmlns" из XDocument?

1 ответов


похоже, что информация о пространстве имен хранится в двух местах в дереве объектов, которое представляет XML-документ в LINQ to XML: как фактический xmlns атрибуты и внутри элементов Names. Если вы удалите его из обоих мест, он исчезнет:

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

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

(первая часть кода выше скопирована из теперь удаленного ответа Бертрана Маррона.)

если вы хотите удалить пространства имен из атрибутов тоже, это немного сложнее, потому что их Name is только для чтения:

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