Problem mit DataGrid.WriteXML()
-
wenn Du die XML-Datei im Visual Studio öffnest,
kannst Du die Daten in 2 Ansichten öffnen!1. XML-Ansicht
2. Daten-AnsichtKann Dein Visual Studio die Datei in Datenansicht vernünfig öffnen?
Du solltest wenn das klappt eine Ansicht in tabellarischer Form bekommen!Ist das so?
sclearscreen
-
sipp schrieb:
Ich lade eine XML Datei in ein DataSet. Die XML Datei ist in puncto Syntax korrekt und fehlerfrei. Wenn ich die Datei nun geladen habe, generiere ich mit NewRow() eine neue Zeile, fülle diese mit Werten und füge sie dann der Tabelle hinzu. Soweit funktioniert alles aber wenn ich das DataSet dann mit .WriteXml() speichern möchte, dann bekomme ich folgenden Fehler:
Token StartElement in state Epilog would result in an invalid XML document.
Wie kann denn da etwas schief gehen? Jemand eine Idee?
Mir fällt da noch folgendes ein nachdem Du eine neue Zeile einfügst, wäre es noch sinnvoll die AcceptChanges-Methode des DataSet aufzurufen!
sclearscreen
-
Hmm habs jetzt erstmal hingekriegt denn gleichen Fehler zu bekommen wie Du!
AcceptChanges löst es nicht. Vielleicht find ich ne Lösung jetzt wo ich den gleichen Fehler habe wie Du. und Du hast recht lässt man oben die Tags vor denperson-Tags weg läufts!
-
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.
-
Das nächste ist halt auch so ein ähm
Du hast ja auch schon mit dem GetXml des DataSet Dir die Sache ausgeben lassen!Hab das dann mal gemacht und in eine TextBox ausgegeben wo MultiLine aus Gründen der Übersicht auf true gesetzt ist.
Ergebnis die neue Zeile war kein Kindknoten vom Element personal
sondern das neue person-Element stand in der Gleichen Ebene wie eben der Knoten personal.
Ich hätte erwartet das die neue Zeile eben gleich mit eingestrikt wird in den Elternknoten der in dem Falle eben personal heisst!
Ich weiss jetzt nicht wie Du darüber denkst? Das DataSet ist eben extrem für die Arbeit mit Datenbanken ausgelegt. Und die XML-Struktur die ein DataSet verwalten tut ist eben auch in Bezug auf Datenbanken (Datenbanken in Verbindung mit SQL) optimiert!
Werde jetzt trotzdem weiter dranrumwerkeln.
-
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...