2010-02-25 15 views
6

Quiero mantener un solo objeto XmlDocument en una clase y dejar que los métodos lo modifiquen y lo guarden.XmlDocument :: Save() agrega el xml en el archivo

using (FileStream fs = new FileStream(@"D:\Diary.xml", 
      FileMode.Open, FileAccess.ReadWrite, FileShare.Read)) 
    { 
         XmlDocument xmlDoc = new XmlDocument(); 
         xmlDoc.Load(fs); 

         .... make some changes here 

         xmlDoc.Save(fs); 
    } 

El código anterior hace dos copias de la estructura xml dentro del archivo.

+0

¿Por qué usando FileStream cuando puede especificar el camino de archivo para la carga? I * think * el comportamiento predeterminado para el acceso a archivos es lo que ha especificado. – Dave

+0

El archivo XML se comparte entre diferentes módulos que lo leen (no escriben). Quiero abrir/leer y bloquear para escribir en este módulo. – A9S6

Respuesta

3

Trate

fs.SetLength(0); 

antes Guardar llamada

+0

OK. Esto funcionó ... Gracias – A9S6

+0

¿Por qué es necesario hacer esto? –

+0

@ IanR.O'Brien Esto se debe a que está utilizando la misma extensión de archivo para cargar el archivo (por lo tanto, después de la carga, la posición se encuentra al final del archivo. Pero lo que quiere hacer es truncar lo que ya está en el antes de volver a escribir el XML. –

2

Añadir:

fs.Position = 0; 

Guardar antes de la llamada.

+0

Lo intenté pero tiene un comportamiento muy extraño. Algunos de los datos se sobrescriben y el archivo completo no es ahora un archivo XML válido. – A9S6

0

Parece un poco extraño que fs.Position a partir de Foole solución no funcionó.

Un equivalente sería

fs.Seek(0, SeekOrigin.Begin); 

Alternativamente

en lugar de utilizar el mismo filestream:

  //OrigPath is the path you're using for the FileReader 

      System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(OrigPath); 
      xmlDoc.Save(writer); 
      writer.Close(); 
+2

No funcionará, porque si el archivo XML original tiene 1000 caracteres de largo, y después de cambiar el documento xml contiene solo 600 caracteres, se le dejarán 400 caracteres al final de la corrección archivo XML que no se deje eliminado. de ahí por qué el error de validación por ejemplo originales cambia XmlDocument para que va a terminar con > Aviso lo innecesario ">" al final –

+0

derecho !! UP para el comentario de @LnDCobra – A9S6

0

Alternativamente, incluso esto funcionaría ...

 XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(@"D:\Diary.xml"); 

     //.... make some changes here 
     XmlText node = xmlDoc.CreateTextNode("test"); 
     xmlDoc.DocumentElement.AppendChild(node); 

     xmlDoc.Save(@"D:\Diary.xml"); 
+0

Bueno, esto podría funcionar, pero creo que será mucho más eficiente establecer la longitud en cero y llamar Guardar – A9S6

+0

Esto no funcionará porque voy a usar el archivo en ese momento para que pueda ' Nunca guarde el archivo. –

Cuestiones relacionadas