Domanda

I metodi XmlElement.Attributes.Remove* funzionano correttamente per gli attributi arbitrari, determinando la rimozione degli attributi rimossi dalla proprietà XmlDocument.OuterXml.L'attributo Xmlns tuttavia è diverso.Ecco un esempio:

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

L'output risultante è

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

L'attributo sembra essere stato rimosso dalla raccolta Attributes, ma non è stato rimosso da XmlDocument.OuterXml.Immagino che sia a causa del significato speciale di questo attributo.

La domanda è come rimuovere l'attributo xmlns utilizzando l'API XML .NET.Ovviamente posso semplicemente rimuovere l'attributo da una rappresentazione String di questo, ma mi chiedo se sia possibile fare la stessa cosa utilizzando l'API.

@Modificare:Sto parlando di .NET 2.0.

È stato utile?

Soluzione

L'API .NET DOM non supporta la modifica dello spazio dei nomi dell'elemento che è ciò che essenzialmente stai tentando di fare.Quindi, per risolvere il tuo problema devi costruire un nuovo documento in un modo o nell'altro.È possibile utilizzare la stessa API DOM .NET e creare un nuovo elemento senza specificarne lo spazio dei nomi.In alternativa, puoi creare un foglio di stile XSLT che trasforma il tuo documento originale con "spazio dei nomi" in uno nuovo in cui gli elementi non saranno qualificati con lo spazio dei nomi.

Altri suggerimenti

Ho visto le varie opzioni in questo thread e sono arrivato a risolvere la mia soluzione per rimuovere gli attributi xmlns in xml.Funziona correttamente e non presenta problemi:

'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

Non è necessario fare altro per rimuovere xmlns da xml.

Mille grazie ad Ali Shah, questo thread ha risolto perfettamente il mio problema!ecco una conversione 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);
            }

Questo non avrebbe dovuto rimuovere gli spazi dei nomi?

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

Ma comunque per la tangente qui, XElement, XDocument e XNomeSpazio le classi dallo spazio dei nomi System.Xml.Linq (.Net 3.0) sono molto migliori rispetto al vecchio modello XmlDocument.Provaci.Io sono dipendente.

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ì, poiché è un nome ELEMENT, non puoi rimuoverlo esplicitamente.Utilizzando WriteStartElement e WirteStartAttribute di XmlTextWriter e sostituendo l'attributo con spazi vuoti è probabile che il lavoro venga completato.

Lo sto controllando adesso.aggiornerà.

Forse tramite XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx ma è solo una supposizione.

Possiamo convertire l'xml in una stringa, rimuovere gli xmlns da quella stringa e quindi creare un altro XmlDocument utilizzando questa stringa, che non avrà lo spazio dei nomi.

ecco la mia soluzione su vb.net ragazzi!

   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")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top