En primer lugar, descalificaría System.Xml.XmlDocument porque it is a DOM requiere analizar y construir todo el árbol en la memoria antes de que pueda agregarse. Esto significa que sus 10 MB de texto tendrán más de 10 MB en la memoria. Esto significa que es "intensivo de memoria" y "consume mucho tiempo".
En segundo lugar, descalificaría System.Xml.XmlReader porque es requires parsing the entire file primero antes de que pueda llegar al punto en que puede agregarlo. Tendría que copiar el XmlReader en un XmlWriter ya que no puede modificarlo. Esto requiere la duplicación de su XML en la memoria antes de poder agregarlo.
La solución más rápida a XmlDocument y XmlReader sería la manipulación de cadenas (que tiene sus propios problemas de memoria):
string xml = @"<Errors><error />...<error /></Errors>";
int idx = xml.LastIndexOf("</Errors>");
xml = xml.Substring(0, idx) + "<error>new error</error></Errors>";
cortar la etiqueta final, añadir en el nuevo error, y añadir la etiqueta de final de vuelta.
Supongo que podría volverse loco con esto y truncar su archivo por 9 caracteres y anexarlo. No tendría que leer en el archivo y dejaría que el SO optimice la carga de la página (solo tendría que cargarse en el último bloque o algo así).
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();
que llegará a un problema si el archivo está vacío o contiene sólo "<errores> </Errores >", ambos de los cuales se pueden manejar fácilmente marcando la longitud.
¿Cómo estás escribiendo esto? ¿Usando DOM? ¿SAXÓFONO? Escrituras directas? :-P Personalmente prefiero el enfoque DOM; solo tiene acceso al nodo Errores y llama a appendChild(). –
Defina "más rápido" para esta situación; ¿Quiere decir "más rápido de ejecutar" o "más rápido de desarrollar"? –
"más rápido de ejecutar" –