순차 액세스 스트림입니다 성가신 수 있습니다. 한쪽 끝을 읽고 스트림을 처리하고 다른 쪽 끝을 써야합니다. 이점은 모든 것을 메모리로 읽어 들일 필요가 없으며 XmlDocument 기반 접근 방식으로 얻을 수있는 DOM을 구축해야한다는 것입니다.
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을 특정 요소까지 읽어서 편집 한 다음 변경된 결과를 출력하고 싶은 유일한 사람은 아닙니다. - 오늘 독서에서 평소보다 맹세코 더 많이 듣는다면 .... 나야! –
@Phill : 스트리밍 방식으로 작성하는 것이 쉽지 않습니다. ( –
'XmlReader'를 서브 클래 싱하는 것 (추상적 인 메소드를 많이 구현하지 않는 한 실제로'XmlTextReader'를 서브 클래스화할 것입니다)은 흥미로운 도전. –