Pergunta

Os métodos XmlElement.Attributes.Remove* estão funcionando bem para atributos arbitrários, resultando na remoção dos atributos removidos da propriedade XmlDocument.OuterXml.O atributo Xmlns, entretanto, é diferente.Aqui está um exemplo:

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"]);

A saída resultante é

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

O atributo parece ter sido removido da coleção Attributes, mas não foi removido de XmlDocument.OuterXml.Acho que é por causa do significado especial deste atributo.

A questão é como remover o atributo xmlns usando a API XML do .NET.Obviamente posso simplesmente remover o atributo de uma representação String disso, mas me pergunto se é possível fazer a mesma coisa usando a API.

@Editar:Estou falando do .NET 2.0.

Foi útil?

Solução

A API .NET DOM não suporta a modificação do namespace do elemento, que é o que você está essencialmente tentando fazer.Então, para resolver o seu problema você tem que construir um novo documento de uma forma ou de outra.Você pode usar a mesma API .NET DOM e criar um novo elemento sem especificar seu namespace.Como alternativa, você pode criar uma folha de estilo XSLT que transforme seu documento original com "espaço para nome" em um novo no qual os elementos não serão qualificados para espaço para nome.

Outras dicas

Eu vi as várias opções neste tópico e resolvi minha própria solução para remover atributos xmlns em xml.Isso está funcionando corretamente e não tem 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

Não há necessidade de fazer mais nada para remover xmlns do xml.

Muito obrigado a Ali Shah, este tópico resolveu meu problema perfeitamente!aqui está uma conversão 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);
            }

Isso não deveria remover namespaces?

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

Mas de qualquer forma, na tangente aqui, o XElement, XDocument e XNameSpace classes do namespace System.Xml.Linq (.Net 3.0) são muito melhores que o antigo modelo XmlDocument.Dê uma chance.Eu sou viciado.

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();
}

Sim, porque é um nome ELEMENT, você não pode removê-lo explicitamente.Usar WriteStartElement e WirteStartAttribute do XmlTextWriter e substituir o atributo por espaços vazios provavelmente fará o trabalho.

Estou verificando agora.atualizará.

Talvez através do XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx mas é apenas um palpite.

Podemos converter o xml em uma string, remover o xmlns dessa string e então criar outro XmlDocument usando esta string, que não terá o namespace.

aqui está minha solução no vb.net pessoal!

   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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top