2010-02-25 13 views
6

Chcę zachować pojedynczy obiekt XmlDocument w klasie i pozwolić metodom na wprowadzanie w nim zmian i zapisywanie.XmlDocument :: Save() dołącza xml do pliku

using (FileStream fs = new FileStream(@"D:\Diary.xml", 
      FileMode.Open, FileAccess.ReadWrite, FileShare.Read)) 
    { 
         XmlDocument xmlDoc = new XmlDocument(); 
         xmlDoc.Load(fs); 

         .... make some changes here 

         xmlDoc.Save(fs); 
    } 

Powyższy kod tworzy dwie kopie struktury xml wewnątrz pliku.

+0

Dlaczego używasz FileStream, gdy Ty można określić ścieżkę do pliku dla obciążenia? Domyślam się, że domyślnym zachowaniem dostępu do plików jest to, co określiłeś. – Dave

+0

Plik XML jest udostępniany różnym modułom, które go odczytują (nie zapisują). Chcę otworzyć/przeczytać i zablokować do pisania w tym module. – A9S6

Odpowiedz

3

Spróbuj

fs.SetLength(0); 

przed zapisaniem rozmowy

+0

OK. To zadziałało ... Dzięki – A9S6

+0

Dlaczego to musi być zrobione? –

+0

@ IanR.O'Brien Dzieje się tak, ponieważ używa on tego samego strumienia plików do załadowania pliku (dlatego po załadowaniu pozycja znajduje się na końcu pliku, ale to, co chcesz zrobić, to obcięcie tego, co już jest w pliku stream przed zapisaniem XML ponownie –

2

Dodaj:

fs.Position = 0; 

przed Save rozmowy.

+0

Próbowałem, ale ma bardzo dziwne zachowanie. Niektóre dane zostaną nadpisane, a cały plik nie jest obecnie prawidłowym plikiem XML. – A9S6

0

Wydaje się to trochę dziwne, że fs.Position z Foole na rozwiązanie nie działa.

Równoważny byłoby

fs.Seek(0, SeekOrigin.Begin); 

Alternatywnie

zamiast przy użyciu tego samego filestream:

  //OrigPath is the path you're using for the FileReader 

      System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(OrigPath); 
      xmlDoc.Save(writer); 
      writer.Close(); 
+2

To nie zadziała, ponieważ jeśli oryginalny plik XML ma 1000 znaków, a po zmianie xmldocument zawiera tylko 600 znaków, pozostanie 400 znaków na końcu poprawnego plik XML, które nie zostaną usunięte. Stąd dlaczego walidacja błąd np oryginalny zmienić XmlDocument do skończy się z > Zawiadomienie niepotrzebne ">" na końcu –

+0

Right !! UP za komentarz @ LnDCobra – A9S6

0

Alternatywnie nawet to będzie działać ...

 XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(@"D:\Diary.xml"); 

     //.... make some changes here 
     XmlText node = xmlDoc.CreateTextNode("test"); 
     xmlDoc.DocumentElement.AppendChild(node); 

     xmlDoc.Save(@"D:\Diary.xml"); 
+0

Cóż, to może działać, ale myślę, że znacznie wydajniej będzie ustawić długość na zero i zadzwonić Zapisz – A9S6

+0

To nie zadziała, ponieważ do pliku będę używał w tym czasie, więc mogę ' t nigdy nie zapisuj pliku ... –

Powiązane problemy