Pregunta

Los métodos XmlElement.Attributes.Remove* funcionan bien para atributos arbitrarios, lo que hace que los atributos eliminados se eliminen de la propiedad XmlDocument.OuterXml.Sin embargo, el atributo Xmlns es diferente.Aquí hay un ejemplo:

XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Element1 attr1=""value1"" xmlns=""http://mynamespace.com/"" attr2=""value2""/>";
doc.DocumentElement.Attributes.RemoveNamedItem("attr2");
Console.WriteLine("xmlns attr before removal={0}", doc.DocumentElement.Attributes["xmlns"]);
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
Console.WriteLine("xmlns attr after removal={0}", doc.DocumentElement.Attributes["xmlns"]);

La salida resultante es

xmlns attr before removal=System.Xml.XmlAttribute
xmlns attr after removal=
<Element1 attr1="value1" xmlns="http://mynamespace.com/" />

El atributo parece haberse eliminado de la colección Attributes, pero no de XmlDocument.OuterXml.Supongo que es por el significado especial de este atributo.

La pregunta es cómo eliminar el atributo xmlns utilizando la API XML de .NET.Obviamente puedo eliminar el atributo de una representación en cadena de esto, pero me pregunto si es posible hacer lo mismo usando la API.

@Editar:Estoy hablando de .NET 2.0.

¿Fue útil?

Solución

.NET DOM API no admite la modificación del espacio de nombres del elemento, que es lo que básicamente estás intentando hacer.Entonces, para resolver tu problema tienes que construir un nuevo documento de una forma u otra.Puede utilizar la misma API .NET DOM y crear un nuevo elemento sin especificar su espacio de nombres.Alternativamente, puede crear una hoja de estilo XSLT que transforme su documento original con "espacio de nombres" en uno nuevo en el que los elementos no estarán calificados para espacios de nombres.

Otros consejos

Vi las distintas opciones en este hilo y vine a resolver mi propia solución para eliminar atributos xmlns en xml.Esto funciona correctamente y no tiene problemas:

'Remove the Equifax / Transunian / Experian root node attribute that have xmlns and load xml without xmlns attributes.
If objXMLDom.DocumentElement.NamespaceURI <> String.Empty Then
  objXMLDom.LoadXml(objXMLDom.OuterXml.Replace(objXMLDom.DocumentElement.NamespaceURI, ""))
  objXMLDom.DocumentElement.RemoveAllAttributes()
  ResponseXML = objXMLDom.OuterXml
End If

No es necesario hacer nada más para eliminar xmlns de xml.

Muchas gracias a Ali Shah, ¡este hilo resolvió mi problema perfectamente!aquí hay una conversión de C#:

var dom = new XmlDocument();
        dom.Load("C:/ExampleFITrade.xml));
        var loaded = new XDocument();
        if (dom.DocumentElement != null)
            if( dom.DocumentElement.NamespaceURI != String.Empty)
            {
                dom.LoadXml(dom.OuterXml.Replace(dom.DocumentElement.NamespaceURI, ""));
                dom.DocumentElement.RemoveAllAttributes();
                loaded = XDocument.Parse(dom.OuterXml);
            }

¿No se suponía que esto eliminaría los espacios de nombres?

XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");

Pero de todos modos, en una tangente aquí, XElement, XDocument y XNameSpace Las clases del espacio de nombres System.Xml.Linq (.Net 3.0) son mejores que el antiguo modelo XmlDocument.Darle una oportunidad.Soy adicto.

public static string RemoveXmlns(string xml)
{
    //Prepare a reader
    StringReader stringReader = new StringReader(xml);
    XmlTextReader xmlReader = new XmlTextReader(stringReader);
    xmlReader.Namespaces = false; //A trick to handle special xmlns attributes as regular
    //Build DOM
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(xmlReader);
    //Do the job
    xmlDocument.DocumentElement.RemoveAttribute("xmlns"); 
    //Prepare a writer
    StringWriter stringWriter = new StringWriter();
    XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);
    //Optional: Make an output nice ;)
    xmlWriter.Formatting = Formatting.Indented;
    xmlWriter.IndentChar = ' ';
    xmlWriter.Indentation = 2;
    //Build output
    xmlDocument.Save(xmlWriter);
    return stringWriter.ToString();
}

Sí, debido a que es un nombre de ELEMENTO, no puedes eliminarlo explícitamente.Usar WriteStartElement y WirteStartAttribute de XmlTextWriter y reemplazar el atributo con espacios vacíos probablemente hará el trabajo.

Lo estoy comprobando ahora.actualizará.

¿Quizás a través del XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx pero es sólo una suposición.

Podemos convertir el xml en una cadena, eliminar los xmlns de esa cadena y luego crear otro XmlDocument usando esta cadena, que no tendrá el espacio de nombres.

¡Aquí está mi solución en vb.net chicos!

   Dim pathXmlTransformado As String = "C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\38387_transformado.xml"
    Dim nfeXML As New XmlDocument
    Dim loaded As New XDocument

    nfeXML.Load(pathXmlTransformado)

    nfeXML.LoadXml(nfeXML.OuterXml.Replace(nfeXML.DocumentElement.NamespaceURI, ""))
    nfeXML.DocumentElement.RemoveAllAttributes()

    Dim dhCont As XmlNode = nfeXML.CreateElement("dhCont")
    Dim xJust As XmlNode = nfeXML.CreateElement("xJust")
    dhCont.InnerXml = 123
    xJust.InnerXml = 123777

    nfeXML.GetElementsByTagName("ide")(0).AppendChild(dhCont)
    nfeXML.GetElementsByTagName("ide")(0).AppendChild(xJust)

    nfeXML.Save("C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\teste.xml")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top