Problem mit DataGrid.WriteXML()
-
sipp schrieb:
Ich weiß, wenn man die weg lässt läuft es. Aber die kann ich leider nicht weglassen. Wenn ich die Datei in VS05 öffne, dann bekome ich auch eine korrekte Datenansicht. Ich kann einen neuen Eintrag hinzufügen...
Allerdings passiert dann Folgendes: Der neue Eintrag <person> wird unterhalb des Wurzelelementes mit dem Tag <NewDataSet> angefügt. Probier das mal aus, voll komisch.Ja ist mir auch schon aufgefallen! Haste es auch schon mit dem XmlTextWriter ausprobiert aber das hat dann den gleichen Effekt!
-
Meine Meinung ist eben das DataSet und wie es die Daten aufbereitet ist ein Tribut an Datenbanken!
Eine Struktur ala:
<personal> <author></author> <title></title> <person> <nachname></nachname> </person> <person> <nachname></nachname> </person> <person> <nachname></nachname> </person> </personal>
Würde einer Tabelle in einer Tabelle gleichkommen!
Das DataSet verwaltet in Bezug auf Datenbanken aber immer nur eine Ergebnistabelle. Man macht ja auf DB's eine SQl-Abfrage und bekommt genau
eine Ergenisrelation.Wobei die Ergebnisrelation einer Tabelle entspricht!
Obige Struktur entspricht aber einer Tabelle in die eine 2. Tabelle eingeschachtelt ist.
Du bekommst eine Tabelle: personal
in der aber auch noch eine Tabelle: person steckt
-
Das ist mir schon klar, aber so eine XML Struktur muss sich doch verwalten lassen. Es ist doch komisch, dass das Ändern eines beliebigen Wertes keine Probleme macht. Lediglich das Hinzufügen macht Probleme. Selbst, wenn ich ein DataGrid benutze kommt der Fehler raus.
-
/* Grober Hack aber funktioniert */ System.IO.FileStream fstream = new System.IO.FileStream("c:\\xmldatei.xml",System.IO.FileMode.Create); System.Xml.XmlTextWriter myXmlWriter = new System.Xml.XmlTextWriter(fstream, System.Text.Encoding.Unicode); try { myXmlWriter.WriteStartDocument(); // Hier wird nur der Epilog geschrieben ds.WriteXml(myXmlWriter); // Hier tritt jetzt die Exception auf Epilog steht jetzt aber schon in der Datei /* Token StartElement in state Epilog would result in an invalid XML document. */ // Dabei müssen wir jetzt tricksen um das XML doch noch fertig zu schreiben } catch { myXmlWriter.Close(); // jetzt ist es fertig geschrieben }
Ich gebe zu das catch ist nicht ganz elegant lässt sich aber noch weiter umstricken (Auf genau die Exception die eben kommt)! Teste den Code doch bitte mal bei Dir! Jedenfalls sieht das XML der geschriebenen Datei jetzt konform aus und kann auch wieder gelesen werden oder!?
mfg sclearscreen
-
Das umgeht sozusagen die Unzulänglichkeiten des DataSet wenn eine Tabelle
in eine andere eingeschachtelt ist wie in Deinem Beispiel aber Du brauchst ja das XML so. Und man brauch trotzdem nicht auf den Einsatz des DataSet verzichten! Haste Es ausprobiert? Ich denke es sollte funzen jetzt oder?mfg sclearscreen
-
In der MSDN wird das erzeugen der XmlTextReader-Instanz, der Aufruf der WriteXml-Methode und das Abschliessen des Xml-Dokumentes durch Close
ja alles in ein und demselben Code-Block gemacht. Was ja auch bei DataSet's mit einer Tabelle funktioniert!
Aber da ja in Deinem XML eine Tabelle in eine bestehende eingeschachtelt ist
kommt es eben zu der Exception.Habe eben einfach mal probiert das Abschliessen des XML-Dokument durch Aufruf der Close-Methode im Catch-Zweig probiert. Siehe da dann funktioniert es.
Teste es aber wie gesagt mal bei Dir.
mfg sclearscreen
P.S.: Man muss halt immmer experimentierfreudig sein
-
OK, ich probiere das mal aus. Allerdings finde ich das seltsam; soll man denn wirklich nur so an ein richtiges Ergebnis kommen? Das wäre dann aber zeimlich schlecht...
Aber ich probiere das mal.
-
Ich hab mal folgendes probiert:
Ich habe ein Programm erstellt mit einem DataSet und einem DataGrid. Wenn man per OpenFileDialog die XML Datei ausgewählt hat wird DataSet.ReadXml() ausgerufen und dann DataGrid.DataSource = DataSet;
Dann funktioniert es, obwohl ich das schonmal probiert habe und es funktionierte nicht......ich bin verwirrt...