PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [.NET]System.Xml Namespace


Gast
2006-11-13, 13:45:06
Hi Leute,

ich habe mich mal etwas intensiver mit XML und der Programmierung von Anwendungen (in Visual Studio .NET), die auf XML-Dateien zugreifen, befaßt. Dabei habe ich mein Hauptaugenmerk besonders auf den System.Xml Namespace des .NET Frameworks gelegt. Soweit ich das verstanden habe, ist das so vorgesehen, daß man, wenn man eine XML-Datei editieren will (z.B. Elemente einfügen oder Element-Strings verändern), den kompletten Dateiinhalt mit Hilfe der Klasse XmlTextReader ausliest, in einer Instanz der XmlDocument-Klasse im Speicher ablegt, dort die gewünschten Manipulationen vornimmt (dafür gibt's Klassen wie XmlNode, XmlElement usw.), und dann über die XmlTextWriter-Klasse die XML-Datei mit dem geänderten Dateiinhalt aus der XmlDocument-Instanz überschreibt.

Jetzt frage ich mich: ist das nicht ein bißchen aufwändig? Man liest eine komplette Datei aus und überschreibt sie an schließend komplett, und das alles um eventuell nur ein einziges XML-Tag in der Datei zu ändern?
Man stelle sich eine XML-Datei vor, die folgendes Element enthält:

...
<Wurst>Salami</Wurst>
...

Wäre es nicht viel einfacher, einfach nur das gewünschte Element (hier: Wurst) auszulesen, den Element-String (Salami) umzuändern (Mortadella), und den Element-String in der Datei zu überschreiben?
So ähnlich wird es ja auch beim .ini-Dateiformat gemacht: es gibt eine Win32-Funktion WritePrivateProfileString(), die in einer Sektion zu einem Schlüssel einen Wert schreibt, und einen eventuell vorher bereits vorhandenen Wert überschreibt.

Das komplette Überschreiben des Dateiinhalts ist auch kritisch in der Hinsicht, daß wenn während der Schreibens etwas schief geht (z.B. das Programm abstürzt), der Dateiinhalt verlorengehen kann.

Gast
2006-11-13, 16:22:47
Der XmlTextReader ist nur da, um eben nicht das ganze Xml Dokument in den Speicher zu laden, sondern dies sequenziell zu durchlaufen, d.h. zurück geht es auch nicht mehr (AFAIK).
Das XmlDocument bietet selbst schon über die Methoden Load/LoadXml an, Xml einzulesen (Dateien, strings usw.) und diese über Save eben wieder zu speichern. Wobei beim XmlDocument eben alles in den Speicher gelesen wird.

Gast
2006-11-13, 19:20:12
Der XmlTextReader ist nur da, um eben nicht das ganze Xml Dokument in den Speicher zu laden, sondern dies sequenziell zu durchlaufen, d.h. zurück geht es auch nicht mehr (AFAIK).
Das XmlDocument bietet selbst schon über die Methoden Load/LoadXml an, Xml einzulesen (Dateien, strings usw.) wobei LoadXml keine Daten aus einer XML-Datei liest, sondern einen als Parameter angegebenen String in das XmlDocument einfügt. Will man aus einer XML-Datei lesen, muß man Load benutzen, und das erwartet als Parameter eine XmlTextReader-Instanz.
Die Manipulation einer bestehenden XML-Datei läuft also über die Sequenz

XmlTextReader -> XmlDocument -> XmlTextWriter

und diese über Save eben wieder zu speichern. Wobei beim XmlDocument eben alles in den Speicher gelesen wird.um beim Save die XML-Datei komplett zu überschreiben. Was ich wie gesagt für unnötig aufwändig und kritisch halte.

Gast
2006-11-13, 20:22:08
Nein, der Load Methode kannst du einfach den Pfadnamen übergeben.