Wie entfernen Xmlns mit .NET XML-API-Attribute
-
09-06-2019 - |
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
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")