Entwickler-Ecke

IO, XML und Registry - XmlDocument: Einfügen einer Node in eine bestimmte Node


Pruit - Mo 26.04.10 18:32
Titel: XmlDocument: Einfügen einer Node in eine bestimmte Node
Hallo allerseids!
Ich versuche zZ meine XML Datei zu verändern, bzw. ein neues Element hinzuzufügen. Dies klappt auch wunderbar.
Mein Problem ist, das ich es einfach nicht hinbekomme das neue Element an die richtige Stelle hinzuzufügen.

Hier meine Test XML:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<XmlNode>
<InnerNode1>
</InnerNode1>
<InnerNode2>
<Item id="1">
<name>Test</name>
</Item>
<Item id="3">
<name>Test 2</name>
</Item>
</InnerNode2>
</XmlNode>

Ich möchte ein weiteres Item in die XML-Datei einfügen.
Hier mein Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
// neues Element von Icon erstellen
            XmlElement newelemententry = xmldoc.CreateElement("Item");

            // neues Attribut für die ID erstellen
            XmlAttribute newelementattr = xmldoc.CreateAttribute("id");

            // Die id übergeben
            newelementattr.Value = "3";

            // Das Attribut dem xml element hinzufügen
            newelemententry.SetAttributeNode(newelementattr);

            // Das erste Element erstellen - Name - 
            XmlElement nameelement = xmldoc.CreateElement("name");

            // Element: Name bekommt Inhalt
            nameelement.InnerText = "Test 3";

            // Element: Name wird als ChildElement unserem neuen Eintrag hinzugefügt
            newelemententry.AppendChild(nameelement);

           // Hier haperts!
           xmldoc.DocumentElement.InsertAfter(newcatalogentry,xmldoc.DocumentElement.LastChild);


xmldoc.DocumentElement.InsertAfter(newcatalogentry,xmldoc.DocumentElement.LastChild);
Hier liegt das Problem.

Ich habe schon in der MSDN geguckt, ich verstehe einfach nicht wie ich ein bestimmte Node anwählen kann und es dort hineinfügen kann.
Über Hilfe würde ich mich freuen.

Mit freundlich Grüßen


danielf - Mo 26.04.10 19:39

Hallo,

du kannst mit XPath ausdrücken (SelectSingleNode [http://msdn.microsoft.com/en-us/library/fb63z0tw.aspx]) ein beliebiges Node selektieren. Zum Beispiel mit "/XmlNode/InnerNode2" oder "/XmlNode/*[position()=2]" und dann die jeweilige InsertAfter Methode. Du solltest aber daran denken, dass der Xml-Standard es nicht vorsieht das Elemente die Reihenfolge einhalten (wobei die meisten Implementieren-Technoligien dies berücksichtigen).

Außerdem solltest du XElement [http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx]/XDocument [http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx] anstatt von XmlElement/XmlDocument verwenden. Diese Klassen sind schneller und konfortabler. Allerdings musste für die Verwendung von XPath den Namespace System.Linq.XPath einbinden.

Gruß


Pruit - Mo 26.04.10 20:10

Hey,
Nach weiterem suchen bin ich auch auf SelectSingleNode gestoßen, hab es auch versucht anzuwenden, jedoch ohne Erfolg. Mein Fehler war die von dir gezeigte XPath Syntax. Jetzt geht es jedoch, dank deiner Hilfe!

Danke für die schnelle und gute Hilfe! :)

Mit freundlichen Grüßen.