XML Writer überschreibt die Datei immer!
-
Ich versuche grade mit C# ein Programm zu schreiben was Projekte verwalten soll. Ich versuche die Projekte in XML zu speichern. Mein Problem ist das er die Datei immer überschreibt. Ich will aber das er die Datei immer weiter füllt und nicht überschreibt.
Der Code dazu:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " "; // 2 Leerzeichentry
{
XmlWriter writer = XmlWriter.Create(@"C:\Users\Public\Documents\Projekte\Projekt.xml", settings);writer.WriteStartDocument();
writer.WriteStartElement("Projekte");
writer.WriteStartElement("Projekt");
writer.WriteElementString("Projektname", projektname);
writer.WriteElementString("Projektbeschreibung", projektbeschreibung);
writer.WriteEndElement();
writer.WriteEndDocument();writer.Close();
Habe leider nirgendwo was gefunden was mir bei dem Problem hilft. Jetzt hoffe ich auf Hilfe von euch oder ein paar Tipps wie man dies umsetzen kann.
-
m4uric3 schrieb:
Ich versuche grade mit C# ein Programm zu schreiben was Projekte verwalten soll. Ich versuche die Projekte in XML zu speichern. Mein Problem ist das er die Datei immer überschreibt. Ich will aber das er die Datei immer weiter füllt und nicht überschreibt.
Der Code dazu:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " "; // 2 Leerzeichentry
{
XmlWriter writer = XmlWriter.Create(@"C:\Users\Public\Documents\Projekte\Projekt.xml", settings);writer.WriteStartDocument();
writer.WriteStartElement("Projekte");
writer.WriteStartElement("Projekt");
writer.WriteElementString("Projektname", projektname);
writer.WriteElementString("Projektbeschreibung", projektbeschreibung);
writer.WriteEndElement();
writer.WriteEndDocument();writer.Close();
Habe leider nirgendwo was gefunden was mir bei dem Problem hilft. Jetzt hoffe ich auf Hilfe von euch oder ein paar Tipps wie man dies umsetzen kann.
@ maurice moss ???
Versuchs mal so:
int i = 0; WriterStartElement("Projekt" + i); i++; oder per Methodenaufruf // Beispiel String bla = "BlaBla"; bla = Console CreateXML(bla); private static createXML(String bla) { ... WriterStartElement(bla); ....... }
Sorry für die schlechte Erklärung !!!!
Gruss Somebodyy
-
edit
Kann sein das es der grösste Unsinn ist, probier es und warte auf weitere Antworten!!
-
Danke ich denke aber er wird bei dem Code auch die Datei überschreiben außer ich gebe ihr immer einen neuen Namen... Mir wurde mal vorgeschlagen das mit einem FileStream zu machen aber ich weiß nicht wie ich das machen soll...
-
m4uric3 schrieb:
Danke ich denke aber er wird bei dem Code auch die Datei überschreiben außer ich gebe ihr immer einen neuen Namen... Mir wurde mal vorgeschlagen das mit einem FileStream zu machen aber ich weiß nicht wie ich das machen soll...
XmlTextWriter f = new XmlTextWriter("C:/file.xml", null);
oder FileStream
// öffne xml Datei FileStream fs = new FileStream(@"c:\path\xml.xml" , FileMode.Open, FileAccess.Write); StreamWriter streamWriter = new StreamWriter(fs); streamWriter.Write("Text hier reinschreiben");
Gruss Sheldor
-
m4uric3 schrieb:
Danke ich denke aber er wird bei dem Code auch die Datei überschreiben außer ich gebe ihr immer einen neuen Namen... Mir wurde mal vorgeschlagen das mit einem FileStream zu machen aber ich weiß nicht wie ich das machen soll...
Versuch es so:
XmlTextWriter writer = new XmlTextWriter(File.Open(filename, FileMode.Append), null);
-
XmlTextWriter writer = new XmlTextWriter(File.Open(filename, FileMode.Append), null);
wenn ich das in einem anderem Projekt mache geht das aber wenn ich das in dem machen was oben steht sagt der Kontext ist nicht vorhanden... bei File.Open
-
Du kannst an ein vollständiges XML-File nicht einfach so Daten anhängen, da ein XML-File aus genau *einem* Top-Level-Element zu bestehen hat.
Hier gibt's einen Artikel dazu wie man es machen kann:
http://www.codeproject.com/KB/XML/XmlAppending.aspx
Allerdings wird hier immer das gesamte File erst gelesen und dann wieder komplett neu geschrieben.
Es sollte auch möglich sein das File erst normal zum Schreiben aufzumachen (
System.IO.File.OpenWrite(FullPath)
), dann zum Ende bzw. vor den End-Tag zu springen (FileStream.Seek
), und es dann an denXmlTextWriter
zu übergeben.Einziges Problem: wie findest du die Länge des End-Tags heraus?
(Nicht dass das unlösbar wäre, aber den Teil wirst du vermutlich "zu Fuss" programmieren müssen)Dann neue Child-Elemente mit dem
XmlTextWriter
reinstecken und den End-Tag neu schreiben.
-
hustbaer schrieb:
Einziges Problem: wie findest du die Länge des End-Tags heraus?
(Nicht dass das unlösbar wäre, aber den Teil wirst du vermutlich "zu Fuss" programmieren müssen)Wobei dieser Fussweg nicht mal unbedingt so mühsam sein muss. Mit einem
XmlReader
um den Stream, kann man sich wohl recht gut hinnavigieren. Ich denke jetzt da insbesondere anXmlReader.Skip()
oderXmlReader.ReadInnerXml()
.Grüssli