Scrivi XML direttamente su disco e aggiungi elementi

Sto cercando di scrivere un file XML, ma è troppo grande per essere memorizzato, quindi voglio scrivere direttamente sul disco. Ho provato a utilizzare XmlWriter ma non c’è funzionalità che mi consenta di aggiungere alla fine del file, quindi sono disposto a ricorrere alla scrittura di XML raw utilizzando un normale file writer.

Qualcuno sa di qualche class di scrittura di file che mi consente di scrivere direttamente su disco e che mi consente di sovrascrivere le posizioni all’interno del file?

Il motivo è che devo essere in grado di scrivere oltre la chiusura dell’elemento root in modo che possa aggiungere un altro bit di informazioni, ma anche essere in grado di leggere il file XML quando necessario. Ad esempio, se avessi il seguente XML:

    

Se volessi leggerlo, potrei, ma se voglio scriverlo devo prima cancellare il , aggiungere un altro elemento e poi aggiungere nuovamente il tag di chiusura.

Grazie per qualsiasi aiuto.

Puoi usare XmlTextWriter.

Basta aprire il file per scrivere, cercare all’inizio dell’elemento finale e quindi aggiungere nuovi elementi desiderati con XmlTextWriter. Per chiudere il file, scrivi semplicemente il testo non elaborato per l’elemento finale per completare il documento e il gioco è fatto.

Ecco un esempio veloce e sporco.

A partire da XML come questo:

     

Puoi aprirlo e aggiungere un elemento come questo:

 using (FileStream f = new FileStream(@"D:\a.xml", FileMode.OpenOrCreate, FileAccess.Write)) { f.Seek(-("\n".Length), SeekOrigin.End); using (XmlTextWriter x = new XmlTextWriter(f, Encoding.UTF8)) { x.WriteStartElement("Another"); x.WriteAttributeString("attr", "value"); x.WriteEndElement(); // Close the file with a new terminating end-element x.WriteRaw("\r\n\r\n"); } } 

E il risultato è:

      

Non si può ottenere la rientranza perfetta ecc., Ma è XML valido. Questo è esattamente ciò che dovresti fare se scrivendo xml come testo non elaborato sul file, ma potresti anche sfruttare il writer XML per fare la formattazione per te.

Sono d’accordo anche con alcuni dei commenti: sarà molto utile utilizzare uno schema per il tuo xml che riduca al minimo le dimensioni. Distriggers rientro. Usa l’elemento più breve e i nomi degli attributi che puoi. E se stai lavorando su elementi foglia, la memorizzazione dei dati come attributi anziché cdata farà risparmiare spazio ( data è più costoso di e questo può essere ulteriormente compresso a – quasi la metà della dimensione originale)

Suppongo che (come suggerisce il commento di @ payo) si possa usare una combinazione di un stream di file, un XmlTextReader (per posizionare lo stream all’elemento appropriato) e un XmlWriter per scrivere i nuovi elementi e quindi riscrivere l’elemento di chiusura.