Saltar al contenido

¿Cómo eliminar el atributo xmlns de un nodo que no sea root en un XDocument?

Solución:

Creo que el siguiente código es lo que quieres. Debe colocar cada elemento en el espacio de nombres correcto, y eliminar cualquier xmlns="" atributos de los elementos afectados. La última parte es necesaria ya que, de lo contrario, LINQ to XML básicamente intenta dejarlo con un elemento de

<!-- This would be invalid -->
<Firstelement xmlns="" xmlns="http://my.namespace">

Aquí está el código:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XDocument doc = XDocument.Load("test.xml");
        // All elements with an empty namespace...
        foreach (var node in doc.Root.Descendants()
                                .Where(n => n.Name.NamespaceName == ""))
        {
             // Remove the xmlns="" attribute. Note the use of
             // Attributes rather than Attribute, in case the
             // attribute doesn't exist (which it might not if we'd
             // created the document "manually" instead of loading
             // it from a file.)
             node.Attributes("xmlns").Remove();
             // Inherit the parent namespace instead
             node.Name = node.Parent.Name.Namespace + node.Name.LocalName;
        }
        Console.WriteLine(doc); // Or doc.Save(...)
    }
}

No es necesario “eliminar” el atributo xmlns vacío. La razón por la que se agrega el atributo xmlns vacío es porque el espacio de nombres de sus childnodes está vacío (= ”) y, por lo tanto, difiere de su nodo raíz. Agregar el mismo espacio de nombres a sus hijos también resolverá este ‘efecto secundario’.

XNamespace xmlns = XNamespace.Get("http://my.namespace");

// wrong
var doc = new XElement(xmlns + "Root", new XElement("Firstelement"));

// gives:
<Root xmlns="http://my.namespace">
    <Firstelement xmlns="" />
</Root>

// right
var doc = new XElement(xmlns + "Root", new XElement(xmlns + "Firstelement"));

// gives:
<Root xmlns="http://my.namespace">
    <Firstelement />
</Root>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *