[C#] Token StartElement in state Epilog would result in an invalid XML document

yellowspam

Erfahrenes Mitglied
Hi@all:

Ich arbeite grade an einer Funktion bei der, der Text aus mehreren Textboxen in ein Xml-file geschrieben wird, aber ich kriege immer beim debuggen folgende Fehlermeldung: "Token StartElement in state Epilog would result in an invalid XML document" .

Hier mal der Source dazu:

Code:
protected void btntest(Object Sender, EventArgs e)
        {
            //definieren eines Streams welcher den Speicherort des xml-file angibt
            Stream pfad = new FileStream(@"D:\\Projects\\Projects_2007\\bluestep.DownloadManager.Solution\\bluestep.DownloadManager\\bluestep.DownloadManager\\xml\\urls.xml",FileMode.Append);
            //erstellt einen neuen XMLWriter
            XmlTextWriter objWriter = new XmlTextWriter(pfad,System.Text.Encoding.UTF8); 
            //beginnt das file zu schreiben
            objWriter.WriteStartDocument();
            //schreiben des namens des Dls
            objWriter.WriteStartElement("txt_dlname");
            objWriter.WriteElementString("txt_dlname.innertext", txt_dlname.Text);
            objWriter.WriteEndElement();
            //schreiben der URl
            objWriter.WriteStartElement("txt_url");
            objWriter.WriteElementString("txt_url.innertext", txt_url.Text);
            objWriter.WriteEndElement();
            //schreiben eines Kommentares in das XML-file 
            objWriter.WriteStartElement("txt_content");
            objWriter.WriteElementString("txt_content.innertext", txt_content.Text);
            objWriter.WriteEndElement();
            //schreiben der Uhrzeit der eintragung
            objWriter.WriteStartElement("txt_dltime");
            objWriter.WriteElementString("txt_dltime.innertext", txt_dltime.Text);
            objWriter.WriteEndElement();
            //Datenstrom in XMLfile schreiben 
            objWriter.Flush();
            //speicher freigeben
            objWriter.Close();
            //ergebnisse ausgeben
            lbl_result.Text = "Eingetragen";

Was habe ich (wieder mal) falschgemacht?
Habe auch in der MSDN nachgesehen und Mr. G. gefragt,aber habe keine Lösung gefunden, hoffe ihr könnt mir helfen.

MFg
Yellowspam
 
Hi

So weit ich weiß, braucht ein Xml-Dokument ein Root-Element.
Also
Code:
<root>
    <elem>text</elem>
    <elem2>
        <elem3>noch mehr text</elem3>
    </elem2>
    ....
</root>
zu dem solltest du auch noch XmlWriter.WriteEndDocument aufrufen, um das Dokument wieder richtig zu schließen
 
Hallo niggo, danke erstmal für deine Hilfe.

Habe es mit XMLwriter versucht, und habe ihn eingefügt.

Es funktioniert leider nicht.

Achja: Ich krieg die fehlermeldung hier(der grüne text):

Code:
protected void btntest(Object Sender, EventArgs e)
        {
            //definieren eines Streams welcher den Speicherort des xml-file angibt
            Stream pfad = new FileStream(@"D:\\Projects\\Projects_2007\\bluestep.DownloadManager.Solution\\bluestep.DownloadManager\\bluestep.DownloadManager\\xml\\urls.xml",FileMode.Append);
            //erstellt einen neuen XMLWriter
            XmlTextWriter objWriter = new XmlTextWriter(pfad,System.Text.Encoding.UTF8); 
            //beginnt das file zu schreiben
            objWriter.WriteStartDocument();
            //schreiben des namens des Dls
            objWriter.WriteStartElement("txt_dlname");
            objWriter.WriteElementString("txt_dlname.innertext", txt_dlname.Text);
            objWriter.WriteEndElement();
            //schreiben der URl
            objWriter.WriteStartElement("txt_url");
            objWriter.WriteElementString("txt_url.innertext", txt_url.Text);
            objWriter.WriteEndElement();
            //schreiben eines Kommentares in das XML-file 
            objWriter.WriteStartElement("txt_content");
            objWriter.WriteElementString("txt_content.innertext", txt_content.Text);
            objWriter.WriteEndElement();
            //schreiben der Uhrzeit der eintragung
            objWriter.WriteStartElement("txt_dltime");
            objWriter.WriteElementString("txt_dltime.innertext", txt_dltime.Text);
            objWriter.WriteEndElement();
            //Datenstrom in XMLfile schreiben 
            objWriter.Flush();
            //speicher freigeben
            objWriter.Close();
            //ergebnisse ausgeben
            lbl_result.Text = "Eingetragen";



Und wo sol ich den Root einfügen? Im C#-Code oder in das XMLfile?
 
Zuletzt bearbeitet:
So wie du derzeit die Xml-Datei schreibst, ist die Datei nicht korrekt. Bei dir kommt folgendes raus:
Code:
<elem>text</elem>
<elem2>text</elem2>
....
eine Xml-Datei darf jedoch nur ein Root-Element haben (siehe Beispiel oben)!
Du musst also nach WriteStartDocument noch ein WriteStartElement aufrufen und dieses als letzte vor WriteEndDocument mit WriteEndElement schließen.

Ob du dabei XmlWriter oder XmlTextWriter nutzt ist egal, da Letzteres von XmlWriter abgeleitet ist ;) (siehe MSDN)


//EDIT
Ein weiterer Grund dafür kann übrigens das Leerzeichen im Tagname sein. Tagname dürfen keine Leerzeichen enthalten, da sonst ein Attribut erwartet werden würde!
 
Zuletzt bearbeitet:
Also nach befolgung deiner Ratschläge sieht es so aus:

Code:
<?xml version="1.0" encoding="Windows-1252" standalone="no"?>
<Downloads>
  <Download>
    <name>Download 1</name>
    <url>http://www.google.at</url>
    <CreationTime>13:38</CreationTime>
    <Description>info</Description>
  </Download>
</Downloads>

Nun habe ich noch ne Frage: Wie krieg ich in das XML absätze zwischen dem <Download> und dem <name> Tag rein?
 

Neue Beiträge

Zurück