Laden...

Xml Datei in DataGrid einlesen, bearbeiten im WPF und wieder abspeichern

Erstellt von NorbertX21 vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.806 Views
N
NorbertX21 Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren
Xml Datei in DataGrid einlesen, bearbeiten im WPF und wieder abspeichern

Hallo,

ich verwende einen Code mit dem man eine Xml Datei einlesen und bearbeiten kann, diesen Code habe ich vor einiger zeit schonmal verwendet und damals funktionierte auch alles. Die Datei die ich jetzt einlesen und bearbeiten möchte ist eine andere und sie ist viel größer. Den Code habe ich angepasst aber das zurückspeichern der Werte klappt noch nicht ganz. Ich hoffe dass ihr mir weiterhelfen könnt, es ist bestimmt nur eine Kleinigkeit die falsch ist.

Gruß

T
2.219 Beiträge seit 2008
vor 5 Jahren

Was du vorhast ergibt keinen Sinn.
Dein XDocument muss beim speichern seine sämtlichen Daten einmal als XML serialisieren und dann in die Ziel Datei schreiben.
Wenn du dies nicht willst, kannst du nur mit einer eigenen XmlWriter Implementierung kümmern.
Ob sich der Aufwand aber lohnt, bezweifle ich etwas.

Oder arbeitest du mit Xml Dateien mit Größen von 1GB oder größer?
Ansonsten lohnt sich der Aufwand nicht.

Nachtrag:
Ggf. solltest du dir mal das Thema De-/Serialisierung mit XML in C# mal anschauen.
Vielleicht findest du dann auch einen besseren Ansatz mit einer einfachen C# Klasse.

Link
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/serialization/

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

N
NorbertX21 Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren

Die Xml Datei ist nicht größer als 1 GB, sehr viel kleiner. Ich möchte nur bestimmte Werte verändern, diese stehen in meinem Grid in Spalte 3. Es sind viele Einträge, die Werte die ich eintragen möchte stehen in TextBoxen (diese habe ich aus einer anderen Datei eingelesen). Es ist den Aufwand schon wert.

T
2.219 Beiträge seit 2008
vor 5 Jahren

Was spricht den dagegen die Daten wie bisher per XDocument.Save zu speichern?
Im Endeffekt sollten die Daten ja dann genau so gespeichert werden, dass du die geänderten Werte hast.
Zwar muss dann die gesamte Datei geschrieben werden, aber wenn wir von weit weniger als 1GB reden, ist das keine große Sache für eine Festplatte.
Oder ändert sich die Datenstruktur oder welchen Grund gegen die aktuelle Lösung gibt es den?

Nachtrag:
In deinem Switch Case für den Speicher Dialog kannst du den No Case entfernen, da sich diese mit dem Default Case deckt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

N
NorbertX21 Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren

Es spricht nichts dagegen, hab ich nicht gesagt. Der Code ist so wie ich ihn geschrieben habe nicht ganz richtig, und ich suche den Fehler. Du hast natürlich recht man kann das so machen.

Ich lese im moment nur einen Teil ein.

C
4 Beiträge seit 2018
vor 5 Jahren

Daa geht so leider nicht. Man kann die werte nicht speichern

T
2.219 Beiträge seit 2008
vor 5 Jahren

@CDV#
Und das soll nicht gehen weil?
Wenn ich die Daten im Grid bearbeite, kann ich diese auch wieder zurück speichern.
Es wäre hilfreich, wenn du deine Aussagen auch entsprechend belegst.
Geht nicht, ist keine Antwort.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor 5 Jahren

Es geht pauschal nicht, nur einen Teil einer (XML-)Datei einzulesen und dann nur diesen Teil wieder in dieser Datei abzuspeichern. Es muß immer die gesamte Datei gespeichert werden (sonst würde es ja auch andere Überladungen von XDocument.Save geben 😉.

Nur wenn sich die Länge des bearbeiteten Teils nicht ändert, dann könnte man diese in der Datei gezielt überschrieben (dies ist aber bei XML-Dateien nur selten gegeben und man müßte sich die exakten Positionen merken - und wehe jemand ändert dann währenddessen diese Datei...).

16.806 Beiträge seit 2008
vor 5 Jahren

Mit XmlDocument geht das; mit XDocument nicht.

4.931 Beiträge seit 2008
vor 5 Jahren

Meinst du so etwas wie den Anwendungsfall in Serializing/deserializing partial XML files?

Trotzdem wird bei XmlDocument ja immer das gesamte XML-Dokument im Speicher gehalten (DOM), so daß zwar ein Teil geändert werden kann, aber immer das gesamte XML-Dokument wieder abgespeichert werden muß.

16.806 Beiträge seit 2008
vor 5 Jahren

XmlDocument hält nicht das gesamte Dokument im Speicher, sondern arbeitet mit Streams.
Daher kann man mit XmlDocument auch sehr sehr, wirklich sehr große XML Dateien bearbeiten, die bei einem XDocument einem mit einer MemoryException um die Ohren fliegen - darauf war die Antwort bezogen.
Beim Speichern dürfte es nicht funktionieren, dass nur die Stelle X bis Y überschrieben wird. Vermute auch XmlDocument wird alles bügeln.

4.931 Beiträge seit 2008
vor 5 Jahren

Bei XmlDocument liest sich das aber anders:

Remarks

The XmlDocument class is an in-memory representation of an XML document. It implements the W3C XML Document Object Model (DOM) Level 1 Core and the Core DOM Level 2.

Ich glaube, du verwechselst dies mit einem SAX-Parser (den es aber standardmäßig nicht im .NET gibt, mittels XmlReader dem aber am nächsten kommt).

PS: SAX.Net ist eine .NET Portierung des Java Sax Parsers.

16.806 Beiträge seit 2008
vor 5 Jahren

Öh, richtig - hast Recht.
Meine XmlReader und nicht XmlDocument.

T
2.219 Beiträge seit 2008
vor 5 Jahren

@Abt
Hatte mir mal vor 1-2 Jahren auch den Spaß gegönnt mal von OpenStreetMaps die Daten von Geofabrik für Deutschland zu parsen.
Ohne den XmlReader wäre das nicht mal sinnvoll möglich gewesen.
Ist schon erstaunlich wenn man da am Stück 100GB durchparsen lässt und sich nur noch durch die Tags hangeln muss.

@Th69
Das die Umsetzung via XDocument so nicht machbar ist, hatte ich ja im ersten Post angedeutet.
Und bei einigen MB, selbst wenn wir von 100MB+ reden, großen XML Dateien lohnt sich es aus meiner Sicht auch nicht hier was neues zu bauen.

Leider weiß ich immer noch nicht was den nun das genaue Problem ist.
Da der TE hier auch kein Feedback gibt wo das Problem genau ist, sehe ich auch keine wirkliche Möglichkeit eine Lösung anzubieten.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

N
NorbertX21 Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren

Vielen Dank für die Antworten

16.806 Beiträge seit 2008
vor 5 Jahren

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Das Verarbeiten von XML (oder auch anderen Datenquellen) ist völlig unabhängig von der UI-Technologie.
[Artikel] Drei-Schichten-Architektur wird Dir jetzt zu tief in die Sache gehen, zeigt aber den grundlegenden Aufbau von Anwendungen.

Du wirst aber nicht drum herum kommen, dass Du Dich mit der XML-Verarbeitung beschäftigen musst.
Wenn ein .NET UI-Element - wie ein Grid - Deine Anforderungen nicht zu 100% erfüllt, dann muss man eben programmieren.
Die Hauptaufgaben eines Entwickler sind eben nicht nur irgendwelche UI-Elemente in einem Editor zusammen zu klicken, sondern Code zu schreiben; so ist das nun mal 😉

N
NorbertX21 Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren

Danke, ich werds mir anschauen. Das speichern krieg ich schon noch irgendwie hin. Die links von dir finde ich sehr gut. Kannst du mir bitte noch bei einer Sache helfen, den rest mach ich schon ... Was muss ich bei XPath (in meinem Bsp) angeben um die gesamte Datei einzulesen?

Oben bei XmlDataProvider hab ich die Source angegeben, einen XPath (University), einen XKey und einen Namen.

Das DataGrid hat ebenfalls eine ItemsSource mit Binding (XPath, hier Semester/Group/Students) und den XPath verwende ich auch bei den TextColumns dort für die Attribute @Name.

Den XPath beim DataGrid kann ich auch löschen, dann steht in jeder Spalte etwas drin, aber ich hab dann nur eine Zeile nicht mehr. Brauche ich vielleicht ein zweites Grid?

16.806 Beiträge seit 2008
vor 5 Jahren

Mal in Einzelnen Wert aus XML auslesen schauen.
Exakt das gleiche Problem wie hier; und dort hab ich bereits einen Stackoverflow Link gepostet, der hier genauso passt und XPath sehr ausführlich erklärt wird.
Mit dem kommst Du selbst schnell an Dein Ergebnis und lernst was dabei.

N
NorbertX21 Themenstarter:in
7 Beiträge seit 2019
vor 5 Jahren

Danke den link kenne ich bereits, damit konnte ich das bisherige Ergebnis erzielen. Wie ich was anzeigen kann weiss ich, in meinem Grid steht im moment entweder nur eine einzige Zeile oder die Attributes, (alle) aber ich schau mir Seite gerne nochmal an.