Sto cercando di modificare un file XmlDocument
contenuto in un file zip:Modifica ZipArchive in memoria .NET
var zip = new ZipArchive(myZipFileInMemoryStream, ZipArchiveMode.Update);
var entry = zip.GetEntry("filenameToEdit");
using (var st = entry.Open())
{
var xml = new XmlDocument();
xml.Load(st);
foreach (XmlElement el in xml.GetElementsByTagName("Relationship"))
{
if(el.HasAttribute("Target") && el.GetAttribute("Target").Contains(".dat")){
el.SetAttribute("Target", path);
}
}
xml.Save(st);
}
Dopo l'esecuzione di questo codice il file contenuto non viene modificato. Se invece di xml.Save(st);
scrivo l'xml su disco, ho ottenuto quello modificato.
Perché il file modificato non è stato scritto sullo zip? Come lo aggiusto?
EDIT:
ho aggiornato il codice:
var tmp = new MemoryStream();
using (var zip = new ZipArchive(template, ZipArchiveMode.Read, true))
{
var entry = zip.GetEntry("xml");
using (var st = entry.Open())
{
var xml = new XmlDocument();
xml.Load(st);
foreach (XmlElement el in xml.GetElementsByTagName("Relationship"))
{
if (el.HasAttribute("Target") && el.GetAttribute("Target").Contains(".dat"))
{
el.SetAttribute("Target", path);
}
}
xml.Save(tmp);
}
}
using (var zip = new ZipArchive(template, ZipArchiveMode.Update, true))
{
var entry = zip.GetEntry("xml");
using (var st = entry.Open())
{
tmp.Position = 0;
tmp.CopyTo(st);
}
}
In questo modo il file zip viene modificato, ma è funziona solo se la lunghezza dei corsi d'acqua è uguale. Se tmp
è più breve il resto del st
è ancora nel file ...
Suggerimenti?
Non vedo che si sta salvando la zip ovunque :) – Luaan
Ho saltato la parte di salvare 'myZipFileInMemoryStream' su disco. Non dovrebbe essere inclusa la parte modificata nello stream? – Emaborsa
Apparentemente, dovrebbe - 'Dopo aver recuperato lo stream, puoi leggere o scrivere nello stream. Quando scrivi sullo stream, le modifiche apportate alla voce verranno visualizzate nell'archivio zip. (MSDN). Ma devi anche riavvolgere il flusso - 'st.Position = 0', altrimenti stai semplicemente aggiungendo il nuovo XML alla fine di quello vecchio. Potrebbe essere il problema? :) – Luaan