public void Save() {
// ...
XmlTextWriter writer
= new XmlTextWriter
(@"D:\data.xml",
null); writer.Formatting = Formatting.Indented;
doc.Save(writer);
}
}
Eso que estás haciendo es muy incorrecto, te va a saltar ua excepción si llamas a tu método
Save() más de una vez. Debes asegurarte de liberar el
stream encapsulado por la clase
XmlTextWriter o de lo contrario no podrás volver a abrir el archivo para escribir ...puesto que seguirá estando abierto/en uso por la instancia anterior de la clase
XmlTextWriter.
Añade una llamada al método
writer.Close() al final de ese bloque de código, o en su defecto decora la declaración del objeto con la sentencia
using.
Alguna idea de que editar en ese codigo para que funcione como quiero?
No entiendo qué quieres hacer exactamente.
Si lo que quieres es actualizar el valor de un elemento existente y/o agregar un nodo o elemento al nodo existente, pues simplemente carga el documento existente y haz tus modificaciones:
string name = "value";
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\data.xml");
doc("Libro")("name").InnerText = name;
doc.Save(@"D:\data.xml");
Y bueno, si quieres utilizar una forma de leer y/o escribir un documento Xml paso a paso, entonces puedes utilizar las clases
XmlTextReader y
XmlTextWriter.
byte[] buffer = File.ReadAllBytes(@"D:\data.xml");
using (MemoryStream ms
= new MemoryStream
()) { ms.Write(buffer, 0, buffer.Length);
ms.Seek(0, SeekOrigin.Begin);
using (XmlTextReader reader
= new XmlTextReader
(ms
)) { using (XmlTextWriter writer
= new XmlTextWriter
(ms, reader
.Encoding)) {
while (reader.Read()) {
if (reader.IsStartElement()) {
switch (reader.Name) {
case "name":
break;
case "autor":
break;
default:
break;
}
}
}
writer.Flush();
using (FileStream fs = File.Create(@"D:\data_new.xml")) {
ms.Seek(0, SeekOrigin.Begin);
ms.CopyTo(fs);
}
}
}
}
¡Saludos!