Во-первых, я бы дисквалифицировал System.Xml.XmlDocument, потому что это DOM , который требует синтаксического анализа и построения всего дерева в памяти, прежде чем оно может быть добавлено. Это означает, что ваши 10 МБ текста будут более 10 МБ в памяти. Это означает, что он «интенсивно использует память» и «занимает много времени».
Во-вторых, я бы дисквалифицировал System.Xml.XmlReader, потому что требует синтаксического анализа всего файла , прежде чем вы сможете дойти до того момента, когда вы сможете добавить его. Вам придется скопировать XmlReader в XmlWriter, поскольку вы не можете его изменить. Это требует дублирования вашего XML в памяти, прежде чем вы сможете добавить к нему.
Более быстрым решением для XmlDocument и XmlReader было бы манипулирование строками (которое имеет свои проблемы с памятью):
string xml = @"<Errors><error />...<error /></Errors>";
int idx = xml.LastIndexOf("</Errors>");
xml = xml.Substring(0, idx) + "<error>new error</error></Errors>";
Отрежьте конечный тег, добавьте новую ошибку и добавьте конечный тег обратно.
Полагаю, вы могли бы сойти с ума от этого, урезать файл до 9 символов и добавить к нему. Не нужно будет читать файл и позволит ОС оптимизировать загрузку страницы (нужно будет загрузить только последний блок или что-то в этом роде).
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();
Это вызовет проблему, если ваш файл пуст или содержит только «», оба из которых можно легко обработать, проверив длину.