2011-08-09 40 views
5

En mi C# código base, tengo una XDocument de la forma:Cómo eliminar el atributo xmlns de 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> 

El uso de LINQ to XML o de otro modo, quería quitar la xmlns para todos los elementos contenidos por el elemento B.

utilizando la metodología dada aquí: How to Remove specific attributes in XMLDocument?, yo era capaz de eliminar todos los atributos excepto xmlns

¿Cuál es la mejor manera de eliminar el atributo 'xmlns' del XDocument?

+0

posible duplicado de [? Cómo eliminar todos los espacios de nombres de XML con C#] (http://stackoverflow.com/questions/987135/how-to -remove-all-namespaces-from-xml-with-c) – BrokenGlass

+0

¿Por qué? ¿tú quieres? Esos no son atributos normales. Ellos definen el espacio de nombres. –

+1

Esto no es un duplicado. Y la respuesta aceptada es mucho más limpia que lo que se reclama por el duplicado 'posible'. – GilliVilla

Respuesta

11

Parece que la información del espacio de nombres se mantiene en dos lugares en el árbol de objetos que representa el documento XML en LINQ a XML: como atributos reales xmlns y dentro de los elementos 'Name s. Si lo quita de ambos lugares se ha ido:

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

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

(. La primera parte del código anterior es copiada de respuesta ahora eliminada por Bertrand Marron)

Si quisiera eliminar espacios de nombres de atributos también, eso es algo más complicado, debido a que su Name es de sólo lectura:

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

De hecho, la clase 'XmlDocument' no tiene un miembro' .Descendants() '. Supongo que este código es para la clase 'XDocument' que no es lo que OP pregunta. – supertopi

+0

@supertopi La pregunta explícitamente pidió LINQ a XML, que es lo que usa esta respuesta. Pero sí, eso significa que es 'XDocument', no' XmlDocument'. – svick

+0

Ok, el título es un poco engañoso :) Propondré una modificación – supertopi