XmlReader/Writer sono flussi accesso sequenziale. Dovrai leggere da una parte, elaborare lo stream come vuoi e scriverlo dall'altra parte. Il vantaggio è che non è necessario leggere l'intera cosa in memoria e creare un DOM, che è ciò che otterresti con qualsiasi approccio basato su XmlDocument.
Questo metodo dovrebbe iniziare:
private static void PostProcess(Stream inStream, Stream outStream)
{
var settings = new XmlWriterSettings() { Indent = true, IndentChars = " " };
using (var reader = XmlReader.Create(inStream))
using (var writer = XmlWriter.Create(outStream, settings)) {
while (reader.Read()) {
switch (reader.NodeType) {
case XmlNodeType.Element:
writer.WriteStartElement(reader.Prefix, reader.Name, reader.NamespaceURI);
writer.WriteAttributes(reader, true);
//
// check if this is the node you want, inject attributes here.
//
if (reader.IsEmptyElement) {
writer.WriteEndElement();
}
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.SignificantWhitespace:
writer.WriteWhitespace(reader.Value);
break;
}
}
}
}
Questo non è così pulito come derivanti proprio XmlWriter, ma trovo che è molto più facile.
[EDIT]
Un esempio di come si potrebbe aprire due flussi in una volta potrebbe essere qualcosa di simile:
using (FileStream readStream = new FileStream(@"c:\myFile.xml", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Write)) {
using (FileStream writeStream = new FileStream(@"c:\myFile.xml", FileMode.OpenOrCreate, FileAccess.Write)) {
PostProcess(readStream, writeStream);
}
}
fonte
2010-02-19 12:35:44
Grazie per la risposta, ho pensato (sperato) che sarebbe stata una semplice operazione. Non posso essere l'unica persona che abbia mai voluto leggere in XML fino a un certo elemento, modificarlo e quindi produrre il risultato modificato. - Se senti più imprecazioni del solito a Reading oggi .... sono io !! –
@Phill: È facile farlo, ma non in modo streaming temo :( –
Sottoclasse 'XmlReader' (in realtà sottoclassi' XmlTextReader', a meno che tu non abbia voglia di implementare un sacco di metodi astratti) è un interessante sfida –