Jak dopisać dane do istniejącego pliku XML

02 lipca 2007, 22:20

KomentarzeKomentarze: 1 KategorieKategorie: .nettips

Od jakiegoś czasu (o ile mam ten czas) przepisuję na nowo XmlBloga. Tym razem chcę skorzystać z klasy XMLWriter, a nie jak do tej pory XmlDocument. Dlaczego z tej klasy? Otóż pozwala ona bardziej panować nad tym co i w jaki sposób jest zapisywane do pliku XML.

Ponadto dzięki tej klasie mogę dopisywać kolejne dane na koniec istniejącego pliku bez wczytywania całości. Jest to dosyć istotne, aby zwiększyć wydajność i przy większej ilości postów nie wczytywać ich wszystkich do pamięci. Zwłaszcza kiedy na stronie wyświetlamy tylko kilka ostatnich.

Poniżej prezentuję prototyp metody zapisującej dane w XMLBlogu w nowej wersji.

   1:  public static void SerializeAndSaveList(IXWriterObject obj)
   2:  {
   3:      string objectTag = obj.GetTag();
   4:      string file = Utils.GetListFileNameForObject(obj);
   5:      file = Path.Combine(XimiManager.DataDirectory, file);
   6:      using (FileStream f = new FileStream(file, FileMode.Open, FileAccess.Write))
   7:      {
   8:          f.Seek(-(objectTag.Length), SeekOrigin.End);
   9:          using (StreamWriter closer = new StreamWriter(f))
  10:          {
  11:              XmlWriter writer = XmlWriter.Create(closer, Utils.WriterSettings);
  12:              obj.Write(writer);
  13:              writer.WriteRaw("\r\n" + objectTag);
  14:              writer.Flush();
  15:          }
  16:      }
  17:  }

Metoda przyjmuje obiekt, który implementuje interface IXWriterObject. Interface ten eksponuje jedną metodę Write, która wpisuje treść do pliku.

Samo dopisanie danych na końcu pliku jest możliwe kiedy go otworzymy i przesuniemy pozycję w strumieniu na koniec (SeekOrigin.End) oraz cofniemy się w stronę początku o tyle znaków z ilu składa się tag zamykający dany plik XML. Na przykład </blogs>. W tym przypadku do pobrania tego tagu korzystam z metody statycznej GetListEndTagForType z klasy Util.

To już w sumie wszystko, a może da się optymalniej? :)

 

Ten artykuł jest widoczny także na: ZINE.NET

Jeśli spodobał Ci się ten artykuł, to podziel się tą informacją z innymi.

Gravatar
Michał Andruchów
2007-07-26 17:47

Mam sugestię. Czy użycie LINQ z XML, dostępne w najnowszej Beta wersji Visual C# Orcas, nie było by łatwiejsze?

Tam też masz kontrolę gdzie dodajesz węzeł (koniec, początek), przyjemne i łatwe do opanowania kodowanie

Pozdrawiam

Dodaj komentarz Dodaj komentarz

Twój email (niepublikowany/opcjonalnie):

Twoja strona (opcjonalnie):

Imię i nazwisko/nick (wymagane):

Treść (wymagane):

Chcę być poinformowany o kolejnych komentarzach:

To pole zostaw puste

Uwaga! Zastrzegam sobie prawo do usuwania obraźliwych i wulgarnych komentarzy.