Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: aspiazu en 30 Abril 2017, 11:29 am



Título: Escribir xml sin sobreescribir
Publicado por: aspiazu en 30 Abril 2017, 11:29 am
Buenas tengo este código que me escribe en un xml los datos de dos variables que tengo .Como puedo hacer que me escriba pero sin borrar lo que estaba puesto ya??

 
Código
  1. public void Save() {
  2.  
  3.        XmlDocument doc = new XmlDocument();
  4.        doc.LoadXml("<Libro></Libro>");
  5.  
  6.        XmlElement newElem = doc.CreateElement("name");
  7.        newElem.InnerText = "" + text;
  8.        doc.DocumentElement.AppendChild(newElem);
  9.  
  10.        XmlElement newElem0 = doc.CreateElement("autor");
  11.        newElem0.InnerText = "" + Autor.autor;
  12.        doc.DocumentElement.AppendChild(newElem0);
  13.  
  14.  
  15.        XmlTextWriter writer = new XmlTextWriter(@"D:\data.xml", null);
  16.        writer.Formatting = Formatting.Indented;
  17.        doc.Save(writer);
  18.    }
  19. }
con eso consigo esta estructura

Código
  1. <Libro>
  2.  <name>DATOS DE LA VARIABLE</name>
  3.  <autor>DATOS DE LA VARIABLE</autor>
  4. </Libro>
 
pero claro,con la funcion save de arriba lo que ago todo el rato es borrar lo que habia y meter los nuevos datos .Lo que quiero es que me valla guardando todos los datos sin borrar nada

Alguna idea de que editar en ese codigo para que funcione como quiero?


Título: Re: Escribir xml sin sobreescribir
Publicado por: Eleкtro en 1 Mayo 2017, 05:36 am
Código
  1. public void Save() {
  2.        // ...
  3.        XmlTextWriter writer = new XmlTextWriter(@"D:\data.xml", null);
  4.        writer.Formatting = Formatting.Indented;
  5.        doc.Save(writer);
  6.    }
  7. }

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:

Código
  1. string name = "value";
  2.  
  3. XmlDocument doc = new XmlDocument();
  4. doc.Load(@"D:\data.xml");
  5. doc("Libro")("name").InnerText = name;
  6. 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.

Código
  1. byte[] buffer = File.ReadAllBytes(@"D:\data.xml");
  2.  
  3. using (MemoryStream ms = new MemoryStream()) {
  4.    ms.Write(buffer, 0, buffer.Length);
  5.    ms.Seek(0, SeekOrigin.Begin);
  6.  
  7.    using (XmlTextReader reader = new XmlTextReader(ms)) {
  8.    using (XmlTextWriter writer = new XmlTextWriter(ms, reader.Encoding)) {
  9.  
  10.            while (reader.Read()) {
  11.                if (reader.IsStartElement()) {
  12.                    switch (reader.Name) {
  13.                        case "name":
  14.                            break;
  15.                        case "autor":
  16.                            break;
  17.                        default:
  18.                            break;
  19.                    }
  20.                }
  21.            }
  22.  
  23.            writer.Flush();
  24.  
  25.            using (FileStream fs = File.Create(@"D:\data_new.xml")) {
  26.                ms.Seek(0, SeekOrigin.Begin);
  27.                ms.CopyTo(fs);
  28.            }
  29.        }
  30.    }
  31.  
  32. }

¡Saludos!