Vra

XmlElement.Attributes.Remove * metodes werk boete vir arbitrêre eienskappe wat lei tot die verwyder eienskappe van XmlDocument.OuterXml eiendom verwyder. Xmlns skryf egter anders. Hier is 'n voorbeeld:

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

Die gevolglike uitset is

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

Die kenmerk blyk uit die versameling eienskappe te verwyder, maar dit is nie uit XmlDocument.OuterXml verwyder. Ek dink dit is as gevolg van die spesiale betekenis van hierdie kenmerk.

Die vraag is hoe om te verwyder die xmlns eienskap met gebruik van NET XML API. Dit is duidelik dat ek kan net verwyder die kenmerk van 'n String voorstelling van hierdie, maar ek wonder of dit moontlik is om dieselfde ding te doen met behulp van die API.

@Edit:. Ek praat van NET 2.0

Was dit nuttig?

Oplossing

NET DOM API ondersteun nie die wysiging naamruimte element se en dit is wat jy in wese probeer om te doen. So, ten einde jou probleem op te los moet jy 'n nuwe dokument een of ander manier op te rig. Jy kan dieselfde NET DOM API te gebruik en skep 'n nuwe element sonder vermelding van sy naamruimte. Alternatiewelik kan jy 'n XSLT style wat jou oorspronklike "namespaced" dokument verander na 'n nuwe een waarin die elemente sal nie namespace-gekwalifiseerde skep.

Ander wenke

Ek het die verskillende opsies in hierdie draad en kom na my eie oplossing op te los vir die verwydering van xmlns eienskappe in XML. Dit is goed werk en het geen probleme:

'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

Dit is nie nodig om enige iets anders te xmlns van xml verwyder nie.

Baie dankie aan Ali Shah, hierdie draad opgelos my probleem perfek! hier is 'n C # omskakeling:

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

Was dit nie veronderstel is om te naamruimtes te verwyder?

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

Maar in elk geval op 'n raaklyn hier, die XElement, XDocument en XNameSpace klasse van System.Xml.Linq naamruimte (Net 3,0) is 'n beter lot as die ou XmlDocument model. Probeer dit. Ek is verslaaf.

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

Ja, want sy 'n element naam, jy kan nie uitdruklik verwyder. Die gebruik van WriteStartElement en WirteStartAttribute XmlTextWriter se en die vervanging van die kenmerk met leë ruimtes sal geneig om te kry die werk gedoen.

Ek is dit nou uitcheck. sal werk.

Miskien trog die XmlNamespaceManager? http://msdn.microsoft.com/en- ons / library / system.xml.xmlnamespacemanager.removenamespace.aspx maar dit is net 'n raaiskoot.

Ons kan die xml te skakel na 'n string, verwyder die xmlns uit dat string, en daarna 'n ander XmlDocument die gebruik van hierdie string, wat nie die naamruimte sal hê.

hier is my oplossing op vb.net ouens!

   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")
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top