的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一样干净,但我发现它更容易。
[编辑]
的你会如何同时打开两个流可能是这样一个例子:
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读入特定元素的人,编辑它然后输出更改后的结果。 - 如果你今天在阅读中听到比平常更多的脏话......这是我的! – 2009-10-01 08:06:52
@Phill:很容易做到这一点,只是没有以流的方式我很害怕:( – 2009-10-01 08:14:52
子类化'XmlReader'(实际上你会'XmlTextReader'的子类,除非你觉得实现很多抽象方法)是一个有趣的挑战 – 2009-10-01 19:28:42