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)