Как удалить атрибут xmlns из XDocument? - PullRequest
8 голосов
/ 10 августа 2011

В моей кодовой базе 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 Ответ

13 голосов
/ 10 августа 2011

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

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

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

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

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

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