2 lipca 2007, 22:20 dario Komentarze (0)

Jak dopisać dane do istniejącego pliku XML

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.

public static void SerializeAndSaveList(IXWriterObject obj)
{
    string objectTag = obj.GetTag();
    string file = Utils.GetListFileNameForObject(obj);
    file = Path.Combine(XimiManager.DataDirectory, file);
    using (FileStream f = new FileStream(file, FileMode.Open, FileAccess.Write))
    {
        f.Seek(-(objectTag.Length), SeekOrigin.End);
        using (StreamWriter closer = new StreamWriter(f))
        {
            XmlWriter writer = XmlWriter.Create(closer, Utils.WriterSettings);
            obj.Write(writer);
            writer.WriteRaw("\r\n" + objectTag);
            writer.Flush();
        }
    }
}
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? :)  

Tagi:

Tip

Komentarze zablokowane

O autorze

Dariusz Gil - projektant i programista aplikacji internetowych budowanych na platformie Microsoft w technologii ASP.NET (C#) oraz MS SQL Server. Obecnie właściciel (narazie :)) jednoosobowej firmy Softio.

Filtruj używając APML