2008-09-16 2 views
6

XmlElement.Attributes.Remove * -Methoden funktionieren einwandfrei für beliebige Attribute, die dazu führen, dass die entfernten Attribute aus der XmlDocument.OuterXml-Eigenschaft entfernt werden. Das Xmlns-Attribut ist jedoch anders. Hier ein Beispiel:So entfernen Sie das Attribut xmlns mit der XML-API .NET

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 resultierende Ausgabe ist

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

Das Attribut scheint aus dem Attribute Sammlung entfernt werden, aber es wird nicht von XmlDocument.OuterXml entfernt. Ich denke, es ist wegen der besonderen Bedeutung dieses Attributs.

Die Frage ist, wie das Xmlns-Attribut mit .NET XML API zu entfernen. Offensichtlich kann ich nur das Attribut aus einer String-Darstellung von diesem entfernen, aber ich frage mich, ob es möglich ist, dasselbe mit der API zu tun.

@Edit: Ich spreche über .NET 2.0.

+0

Ich lief gerade in dieses Problem. Guter Fund! –

Antwort

2

Die .NET DOM API unterstützt nicht das Ändern des Namespace des Elements, was Sie im Wesentlichen tun möchten. Also, um Ihr Problem zu lösen, müssen Sie ein neues Dokument auf die eine oder andere Weise erstellen. Sie können dieselbe .NET DOM-API verwenden und ein neues Element erstellen, ohne dessen Namespace anzugeben. Alternativ können Sie ein XSLT-Stylesheet erstellen, das Ihr ursprüngliches Namespaced-Dokument in ein neues umwandelt, in dem die Elemente nicht Namespace-qualifiziert sind.

+0

Ich bin mir nicht sicher, aber solange es keine positive Antwort gibt, glaube ich, dass es wahr ist. – axk

0

Ja, weil es ein ELEMENT-Name ist, können Sie es nicht explizit entfernen. Wenn Sie WriteStartElement und WirteStartAttribute von XmlTextWriter verwenden und das Attribut durch Leerzeichen ersetzen, wird die Aufgabe wahrscheinlich erledigt.

Ich überprüfe es jetzt. werde Dich auf dem Laufenden halten.

1

Soll das nicht Namespaces entfernen?

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

Aber trotzdem auf eine Tangente hier das XElement, XDocument und XNameSpace Klassen von System.Xml.Linq Namespace (.NET 3.0) sind ein besseres Los als das alte Modell XmlDocument. Probieren Sie es aus. Ich bin süchtig.

+0

Danke für den Vorschlag. Werde es definitiv versuchen. – axk

0

Wir können die XML in eine Zeichenfolge konvertieren, entfernen Sie die Xmlns aus dieser Zeichenfolge, und erstellen Sie ein anderes XmlDocument mit dieser Zeichenfolge, die den Namespace nicht haben.

1

Ich sah die verschiedenen Optionen in diesem Thread und kommen, um meine eigene Lösung zum Entfernen von Xmlns-Attribute in XML zu lösen. Dies funktioniert einwandfrei und hat keine 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 

Es gibt keine Notwendigkeit, etwas anderes zu tun Xmlns von xml zu entfernen.

2

Vielen Dank an Ali Shah, dieser Thread löste mein Problem perfekt! hier ist eine C# Umwandlung:

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

Eine kleine Beschreibung Ihrer vorgeschlagenen Antwort wäre hilfreich. – Rob

0

hier ist meine Lösung auf vb.net Jungs!

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") 
Verwandte Themen