Problem mit DataGrid.WriteXML()
-
Ich erzeuge mit folgender Zeile eine neue Zeile:
DataRow row = dataSet.Tables["member"].NewRow();
Und dann fülle ich alle Spalten der Zeile:
row["name"] = "...";
row["email"] = "...";usw...
Danach füge ich die Zeile in die tabelle ein:
dataSet.Tables["member"].Rows.Add( row );
So sollte das doch richtig sein, aber wenn ich dann dataSet.WriteXml() aufrufe kommt besagter Fehler. Die XML Datei ist aber korrekt, das habe ich mehrfach überprüft und auch beim Einlesen in das DataSet gibts keinen Fehler.
-
sipp schrieb:
Ich erzeuge mit folgender Zeile eine neue Zeile:
DataRow row = dataSet.Tables["member"].NewRow();
Und dann fülle ich alle Spalten der Zeile:
row["name"] = "...";
row["email"] = "...";usw...
Danach füge ich die Zeile in die tabelle ein:
dataSet.Tables["member"].Rows.Add( row );
So sollte das doch richtig sein, aber wenn ich dann dataSet.WriteXml() aufrufe kommt besagter Fehler. Die XML Datei ist aber korrekt, das habe ich mehrfach überprüft und auch beim Einlesen in das DataSet gibts keinen Fehler.
Rein zufällig habe ich mal ein kleines Programm geschrieben was auch mit Xml und dem DataSet arbeitet!
Ich habe meinen Code angepasst und Deinen Ansatz reinimplementiert! Ergebnis bei mir funktioniert es anstandslos!try { DataSet ds =new DataSet(); ds.ReadXml("c:\\Personal.xml",System.Data.XmlReadMode.Auto); DataRow dr = ds.Tables["Person"].NewRow(); dr["Name"] = "sclearscreen"; dr["Vorname"] = "sclearscreen"; ds.Tables["Person"].Rows.Add(dr); this.dataGrid1.DataSource = ds; } catch(Exception ex) { MessageBox.Show(ex.Message); }
poste doch mal bitte Deine XML-Datei sonst kann ich Dir nicht weiterhelfen!
So pauschal kannst Du nicht sagen das die in Ordnung ist, vielleicht hast Du auch einen Buchstabendreher in einen der Tags.
Oder Du nimmst als Tabellennamen ein Tag der als Tabelle gesehen garnicht den Knoten enthält den Du ansprechen willst. Das muss man genau nachkontrollieren.Mir passiert manchmal auch so ein Buchstabendreher. Und dann bekomme ich ach ne Exception etwa "liegt ausserhalb des Bereich"
P.S.: Bitte XML-Datei nochmal genau kontrollieren insbesonder wie heissen die Tag und vergleiche die Tagnamen mit den Indexnamen wo Du die in dem DataRow-Objekt ansprichst!
Der Code funktionier jedenfalls so
mfg scleascreen
-
Achja wie rufst Du den WriteXml direkt auf das Ding hat ja mehrer Möglichkeiten (8 Stücker)??
-
Es kann nur entweder an einen Buchstabendreher bei Dir liegen (Bei Tagnamen) oder dein XML-Datei ist doch nicht konform! Bei mir klappt es.
try { DataSet ds =new DataSet(); ds.ReadXml("c:\\Personal.xml",System.Data.XmlReadMode.Auto); DataRow dr = ds.Tables["Person"].NewRow(); dr["Name"] = "Sclearscreen"; dr["Vorname"] = "sclearscreen ahja"; ds.Tables["Person"].Rows.Add(dr); this.dataGrid1.DataSource = ds; ds.WriteXml("c:\\Personal.xml"); } catch(Exception ex) { MessageBox.Show(ex.Message); }
Mein Visual Studio was die XML-Datei auch anzeigt erkennt sogar das mein XML-Datei geändert wurde und fragt mich ob sie neu geladen werden soll ich Tipp das doch was nicht richtig ist an Deiner XML-Datei poste die dochmal wenn die nicht so gross ist. Hast Du die Datei selbst geschrieben oder wird dir diese Xml-Datei von einer Datenbank/anderen Programm generiert!?
-
Token StartElement in state Epilog would result in an invalid XML document.
Ich erinnere mich diese Meldung auchmal bekommen zu haben, die Meldung besagt im übrigen das die XML-Datei wirklich nicht konform ist!
Als ich sowas mal bekamm lags bei mir daran das ich das Wurzelelement nicht abgeschlossen hatte bzw. ganz vergessen hab.Hast Du die Datei auch mit dem Visual Studio angelegt sollt sowas nathürlich nicht passieren. Weil das Teil den schliessenden Tag immer automatisch generiert.
Hat man die XML-Datei mit einem simplen Texteditor geschrieben oder nachträglich dranrumeditiert können sich leicht Fehler einschleichen.
Abhilfe schafft da nur ein Editor der auf XML ausgelegt ist.
mfg sclearscreen
-
sclearscreen schrieb:
DatasetName.ExistingTable.NewRow();
hat den Vorteil das eine generierte Zeile genau konform zu den zugrundelegende Daten des DataSet ist! Diese neue Zeile ist damit 100% kompatibel zu Deinem DataSet.
mfg
Hmm hier merke ich gerade das ich Mist erzählt hatte!!
irgendetwas ist beim markieren und kopieren schief gelaufen.
das DataSet hat keine Eigenschaft/Methode namens ExistingTablesitze gerade an meiner IDE und bemerke es gerade richtig muss es heissen
DatasetName.NewRow();
Und es ist klar wenn Du vor der Methode NewRow eine DataSet fehlerfrei mit Daten gefüttert hast erzeugt Dir eben NewRow-Methode eine zu 100% kompatible Datsatzzeile die Du dann zu den bestehemden einfügen kannst.
Zurück zum Thema
Folgender Beispielcodetry { DataSet ds =new DataSet(); ds.ReadXml("c:\\Personal.xml",System.Data.XmlReadMode.Auto); DataRow dr = ds.Tables["Person"].NewRow(); dr["Name"] = "Sclearscreen"; dr["Vorname"] = "sclearscreen ahja"; ds.Tables["Person"].Rows.Add(dr); this.dataGrid1.DataSource = ds; ds.WriteXml("c:\\Personal.xml"); } catch(Exception ex) { MessageBox.Show(ex.Message); }
mein XML sieht so aus:
<?xml version="1.0" standalone="yes"?> <Personal> <Person> <Name>A</Name> <Vorname>A</Vorname> </Person> <Person> <Name>B</Name> <Vorname>B</Vorname> </Person> </Personal>
arbeitet bei mir aber wirklich anstandslos das visual Studio merkt auch wie schon von mir gesagt das meine XML-Datei von einem Programm geändert wurde und fragt mich ob es die Datei neu laden soll!
Und die besagte englische Fehlermeldung
Token StartElement in state Epilog would result in an invalid XML document
sagt direkt das Dein XML nicht konform ist. Und vorangegangen sagte ich ja auch schon das ich den Fehler auch schon hatte. Bei mir war soweit ich mich erinnere der fehlende schliessende Tag beim Wurzelelement der ausschlaggebende Punkt.mfg sclearscreen
so jetzt haue ich mich aber wirklich hin bevor ich wieder wirres Zeug rede
-
Also erstmal Danke für die Antworten. Die XML Datei ist OK, da bin ich sicher, denn die Datei wird da perfekt gerschrieben, wenn ich nur Werte in bestehenden Zeilen ändere. Dann klappt das Schreiben. Nur wenn ich eine neue Zeile hinzufüge, dann passt das nicht. Ich habe mir mal mit GetXml() das resultierende Markup in eine separate Datei geschrieben und das war dann fehlehaft, d.h. es fehlte viel am Ende der Datei, auch die schließenden Tags. Das erklärt, wieso das DataSet abbricht, aber dann stellt sich die Frage, wieso die Werte im DataSet so durcheinander geraten.
Ach ja, die XML Datei wird auch von einem Validator als korrekt anerkannt, d.h. da ist alles mit in Ordnung, da bin ich sicher. Die Tatsache, dass die Datei richtig zurück geschrieben wird, wenn ich nur Zeilen ändere, zeigt ja, dass die XML Datei OK ist. Lediglich das Hinzufügen einer neuen Zeile macht alles kaputt. Und da steh ich voll aufm Schlauch...
-
Kannst auch noch den XmlTextWriter mitbenutzen!
Guck bei dem Teil aber nochmal in die MSDN hab die gerade leider nicht zur Hand!
Bei dem Teil kannst du in Sachen XML mehr auf "Low Level" gehen.
-
Ich habe jetzt nochmal eine ganze Weile über der Sache meditiert und habe den Grund gefunden, warum das programm dann abstürzt.
Meine XML Sieht in etwa so aus:
<personal>
<author>...</author>
<title>...</title><person>
<nachname>...</nachname>
<vorname>...</vorname>
</person><person>
<nachname>...</nachname>
<vorname>...</vorname>
</person>
</personal>Wenn ich die Tags <author> und <title> drin lasse kommt der fehler, nehme ich sie raus, so dass nur noch die <person> Abschnitte drin sind, so passiert der Fehler nicht. Hilft das, mir bei dem Problem zu helfen?
-
Hat keine eine Idee oder einen Hinweis?
-
sipp schrieb:
.... , warum das programm dann abstürzt.
Ich gehe davon aus Du hast um das ganze Gedöns kein try/catch
drumrumgebaut? Das ist eine sinnvolle Sache! Bau das erstmal drumrum
und poste dann mal, was im Member Message der geworfenen
System.Exception-Instanz drinsteht.Ich würde wetten da steht dann sowas in der Richtung:
Element xyz kann nicht geschachtelt in irgendwas stehen so oder so ähnlich. Wäre möglich das diese Meldung kommt!
sclearscreen
-
Die meldung der Exception lautet:
Token StartElement in state Epilog would result in an invalid XML document.
-
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.