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 Leerzeichen

    try
    {
    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 Leerzeichen

    try
    {
    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 den XmlTextWriter 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.


  • Administrator

    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 an XmlReader.Skip() oder XmlReader.ReadInnerXml() .

    Grüssli


Log in to reply