Frage

XmlElement.Attributes.Remove * Methoden arbeiten für beliebige Attribute fein was die entfernten Attribute aus XmlDocument.OuterXml Eigenschaft entfernt werden. Xmlns Attribut jedoch unterschiedlich ist. Hier ein Beispiel:

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 wegen der besonderen Bedeutung dieses Attributs ist.

Die Frage ist, wie die xmlns entfernen .NET XML-API-Attribut. Natürlich kann ich entfernen Sie einfach das Attribut aus einer String-Darstellung, aber ich frage mich, ob es möglich ist, die gleiche Sache mit der API zu tun.

@Edit. Ich spreche von .NET 2.0

War es hilfreich?

Lösung

.NET DOM-API nicht unterstützt Element Namensraum zu modifizieren, das ist das, was Sie im Wesentlichen zu tun versuchen. Also, um Ihr Problem zu lösen Sie eine neue Dokument konstruieren müssen eine oder andere Weise. Sie können den gleichen .NET DOM-API verwenden, und ein neues Element erstellen, ohne seinen Namespace angibt. Alternativ können Sie einen XSLT-Stylesheet erstellen, die Ihr ursprüngliches „Namensraum“ Dokument zu einem neuen werden die Elemente, in denen transformiert werden nicht Namespace-qualifiziert.

Andere Tipps

sah ich die verschiedenen Optionen in diesem Thread und kommen meine eigene Lösung zu lösen für xmlns Attribute in XML zu entfernen. Dies ist einwandfrei funktioniert 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, irgendetwas anderes zu tun Xmlns aus XML zu entfernen.

Vielen Dank an Ali Shah, dieses Thema meines Problem gelöst 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);
            }

War diese Namespaces entfernen eigentlich nicht?

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.

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, weil sein ein Elementname, können Sie es nicht explizit entfernen. Mit XmlTextWriter der Write und WirteStartAttribute und ersetzt das Attribut mit leeren Räumen wird wahrscheinlich den Job zu erledigen.

Ich überprüfe jetzt ist es aus. aktualisieren.

Vielleicht die XmlNamespaceManager Trog? http://msdn.microsoft.com/en- us / library / system.xml.xmlnamespacemanager.removenamespace.aspx aber es ist nur eine Vermutung.

Wir können die XML in einen String konvertieren, entfernen Sie die xmlns aus dieser Zeichenfolge, und dann ein anderes XmlDocument erstellen diese Zeichenfolge verwendet, die den Namespace nicht haben wird.

Hier ist meine Lösung auf vb.net guys!

   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")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top