Friday, January 25, 2008

how to use XmlDocument.Save and XmlWriter

Keywords: XmlDocument class, XmlWriter, FileStream, StringBuilder


原本想使用XmlWriter来格式化一个文件流, 结果是: Xml是被格式化了, 但格式化后的字符串是append到原来的流中, 而不是重写到文件流中. 为什么会出现这个现象呢? 我们先分析一下原来的代码:




public void BeautifyXml(FileStream fileStream)
{
XmlDocument xmlDoc = new XmlDocument();

//1. 重置m_fileStream的position为0, 否则xmlDoc.Load可能会出现异常
fileStream.Position = 0;

//2. 加载m_FileStream的内容到xmlDoc
xmlDoc.Load(fileStream);

//3. 创建一个XmlWriterSettings对象, 设置它的Format
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.IndentChars = " ";

//4.创建一个输出到fileStream的XmlWriter
XmlWriter writer = XmlWriter.Create(fileStream, xmlWriterSettings);

//5.保存XmlDocument的内容, 即输出到fileStream
xmlDoc.Save(writer);
}

在step2之后,XmlDoc对象已经完成Xml的加载, 然后在step4创建了一个输出到fileStream的XmlWriter, step5用xmlDoc.Save(writer)输出Xml到流中. 可以想象保存动作执行顺序应该是xmlDoc.Save()--->writer--->fileStream, 在保存时fileStream还保存着原来未被格式化的内容, 所以writer将xml的内容追加到fileStream. 知道问题的原因, 解决方案就简单了. 在step5之前先将fileStream的内容清空,可以用下面语句


fileStream.SetLength(0);

No comments: