.NET
XML: Den Namen eines XmlNode Aendern
Posted on .Wenn man unter .NET mit XML Dokumenten arbeitet, nimmt man sehr oft Änderungen am Dokument vor. Doch letztens ist mir aufgefallen, dass eine der einfachsten Änderungen garnicht so einfach ist, nämlich wenn man den Namen eines XmlNode ändern will. Also die XmlNode.Name Eigenschaft.
Denn wenn man mal einen Blick ins MSDN wirft wird man feststellen, dass diese Eigenschaft read-only ist! Das ist natürlich blöd, da man nun keinen einfachen Weg hat den Namen des Knotens zu ändern.
Wenn man diesen aber unbedingt ändern will muss man das über einen kleinen Umweg machen. Man muss ein neues XmlElement erstellen und dabei den Namen ändern, anschließend noch alle Attribute und Kinder-Elemente des alten Elements übernehmen und an der Stelle des alten wieder in das XmlDocument einfügen.
Bild 1: Struktur & Änderungswunsch
Konkret sieht das Ganze so aus: C#
private void Form1_Load(object sender, EventArgs e) { //XmlDomument erstellen und eine Xml-Datei laden XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Application.StartupPath + "\xml.xml"); //Zur Demonstration die alte XML-Struktur ausgeben System.Console.WriteLine(xmlDoc.OuterXml); //Das Element das umbenannt werden soll heraussuchen XmlElement oldElement = (XmlElement)xmlDoc.GetElementsByTagName("books")[0]; //Das herausgesuchte Element mit einem neuen Namen klonen XmlElement newElement = renameXmlElement(oldElement, "my-books"); //Das alte Element mit dem neuen ersetzen oldElement.ParentNode.ReplaceChild(newElement, oldElement); //Kontrolle: Die neue Struktur ausgeben System.Console.WriteLine(xmlDoc.OuterXml); xmlDoc.Save(Application.StartupPath + "\xml.xml"); } public static XmlElement renameXmlElement(XmlElement e, string newname) { //Neues XmlElement mit neuem namen anlegen XmlElement newElement = e.OwnerDocument.CreateElement(newname); //Dem neuen XmlElement alle Attribute des alten Elements übergeben foreach (XmlAttribute a in e.Attributes) { newElement.SetAttributeNode((XmlAttribute)a); } //Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen foreach (XmlNode n in e.ChildNodes) { newElement.AppendChild(n.Clone()); } //Das neue XmlElement zurückgeben return newElement; }Und hier das Ganze noch mal in VB.NET:
Private Sub Form1_Load(sender As Object, e As EventArgs) 'XmlDomument erstellen und eine Xml-Datei laden Dim xmlDoc As New XmlDocument() xmlDoc.Load(Application.StartupPath + "xml.xml") 'Zur Demonstration die alte XML-Struktur ausgeben System.Console.WriteLine(xmlDoc.OuterXml) 'Das Element das umbenannt werden soll heraussuchen Dim oldElement As XmlElement = DirectCast(xmlDoc.GetElementsByTagName("books")(0), XmlElement) 'Das herausgesuchte Element mit einem neuen Namen klonen Dim newElement As XmlElement = renameXmlElement(oldElement, "my-books") 'Das alte Element mit dem neuen ersetzen oldElement.ParentNode.ReplaceChild(newElement, oldElement) 'Kontrolle: Die neue Struktur ausgeben System.Console.WriteLine(xmlDoc.OuterXml) xmlDoc.Save(Application.StartupPath + "xml.xml") End Sub Public Shared Function renameXmlElement(e As XmlElement, newname As String) As XmlElement 'Neues XmlElement mit neuem namen anlegen Dim newElement As XmlElement = e.OwnerDocument.CreateElement(newname) 'Dem neuen XmlElement alle Attribute des alten Elements übergeben For Each a As XmlAttribute In e.Attributes newElement.SetAttributeNode(DirectCast(a, XmlAttribute)) Next 'Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen For Each n As XmlNode In e.ChildNodes newElement.AppendChild(n.Clone()) Next 'Das neue XmlElement zurückgeben Return newElement End FunctionKompliziert ist es natürlich nicht, aber trotzdem etwas ärgerlich, dass man diese Methode dann doch selber implementieren muss.
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author bigbasti87
Posted at 10:31 22. Juli 2010.
Bloggd: XML: Den Namen eines XmlNode Aendern – http://blog.bigbasti.com/xml-den-namen-e… #xml
Author InSiDeR
Posted at 10:20 16. März 2012.
Danke dafür. Hast du auch ein Beispiel, wie man das mit dem XmlReader statt dem XmlDoc lösen kann?
Author InSiDeR
Posted at 11:18 16. März 2012.
Kann man das auch mit xmlreader lösen?