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.
Juli 22nd, 2010
Bloggd: XML: Den Namen eines XmlNode Aendern – http://blog.bigbasti.com/xml-den-namen-e... #xml