2 lipca 2007, 22:20
dario
Komentarze (0)
xml
tip
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? :)
58da41b8-bb93-4786-9f78-8328b2ef8e13|0|.0
Tagi: xmltip
Tip