たXmlReader /ライター可能性も観察されてきました順次アクセスストリームです。あなたは一端を読み込み、ストリームを処理し、もう片方を書き出す必要があります。利点は、全体をメモリに読み込んでDOMを構築する必要がないことです。これは、XmlDocumentベースのアプローチで得られるものです。
は、この方法は、あなたが始める必要があります。
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;
}
}
}
}
これは、あなた自身のXmlWriterを導出するほどきれいではありませんが、私はそれがはるかに簡単だということを見つけます。
[EDIT]
あなたはこのようなものかもしれません一度に2つのストリームをオープンする方法の例:
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);
}
}
返信ありがとう、私は(希望)これは素敵な簡単な操作になると思った。これまでにXMLを特定の要素まで読み込み、編集してから変更された結果を出力したいと思った唯一の人になることはできません。 - 今日レディングでいつもより誓いを聞いたら....それは私です! –
@Phill:それはXmlReader'は(あなたが抽象メソッドの多くを実装するように感じない限り、実際には、 'XmlTextReader'をサブクラス化したい)である'サブクラス:(ちょうどストリーミング方式で、私は怖いではない、それを行うのは簡単だ –
興味深い課題 –