BigBasti's Blog About Me & my Digital Lifestyle

22Jul/101

XML: Den Namen eines XmlNode Aendern

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 Function

Kompliziert ist es natürlich nicht, aber trotzdem etwas ärgerlich, dass man diese Methode dann doch selber implementieren muss.

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Yigg
  • Google Bookmarks
  • PDF
  • MySpace
  • email
  • Identi.ca
  • Twitter

hat dir dieser Artikel gefallen?

Dann abonniere doch diesen Blog per RSS Feed!

Kommentare (1) Trackbacks (0)
  1. Bloggd: XML: Den Namen eines XmlNode Aendern – http://blog.bigbasti.com/xml-den-namen-e... #xml


Leave a comment

(required)

Noch keine Trackbacks.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes