Po pierwsze, dyskwalifikuję plik System.Xml.XmlDocument, ponieważ it is a DOM wymaga analizowania i budowania całego drzewa w pamięci, zanim będzie można do niego dołączyć. Oznacza to, że Twoje 10 MB tekstu będzie miało więcej niż 10 MB pamięci. Oznacza to, że jest "czasochłonny" i "czasochłonny".
Po drugie, dyskwalifikuję System.Xml.XmlReader, ponieważ jest to requires parsing the entire file, zanim będzie można przejść do momentu, w którym można do niego dołączyć. Musiałbyś skopiować XmlReader do XmlWriter, ponieważ nie możesz go zmodyfikować. Wymaga to powielenia XML-a w pamięci, zanim będzie można do niego dołączyć.
Im szybciej rozwiązanie XmlDocument i XmlReader byłoby manipulacji ciąg (który ma swoje problemy z pamięcią):
string xml = @"<Errors><error />...<error /></Errors>";
int idx = xml.LastIndexOf("</Errors>");
xml = xml.Substring(0, idx) + "<error>new error</error></Errors>";
odciąć znacznika końcowego, dodać nowego błędu i dodać znacznik końcowy powrotem.
Przypuszczam, że można oszaleć i skasować plik o 9 znaków i dołączyć do niego. Nie musiałby czytać w pliku i pozwalałby systemowi optymalizować ładowanie strony (musiałby załadować tylko ostatni blok lub coś takiego).
System.IO.FileStream fs = System.IO.File.Open("log.xml", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);
fs.Seek(-("</Errors>".Length), System.IO.SeekOrigin.End);
fs.Write("<error>new error</error></Errors>");
fs.Close();
To trafi problem, jeśli plik jest pusty lub zawiera tylko „< Błędy > </Błędy >”, z których oba mogą być łatwo obsługiwane przez sprawdzenie długości.
Jak to piszesz? Korzystasz z DOM? SAX? Direct pisze? :-P Osobiście preferuję podejście DOM; wystarczy uzyskać dostęp do węzła błędów i wywołać appendChild(). –
Zdefiniuj "najszybciej" w tej sytuacji; masz na myśli "najszybszy do wykonania" lub "najszybciej rozwijający się"? –
"najszybszy do wykonania" –