保存xml文档会导致文件损坏
本文关键字:文件 损坏 xml 文档 保存 | 更新日期: 2023-09-27 18:28:53
我有一个关于如何将xmldoc保存为word文件的问题。我想打开word文件,使用xmldocument类对取消删除的xml结构进行一些操作,然后将其重新保存回word文件。这就是我目前正在做的事情:
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"E:'HelloWorld.docx", true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
var xmlDoc = new XmlDocument();
using (Stream partStream = part.GetStream())
using (XmlReader partXmlReader = XmlReader.Create(partStream))
xmlDoc.Load(partXmlReader);
//xml node manipulation here
xmlDoc.Save(@"E:'HelloWorld.docx");
}
然而,这会导致文档损坏。实现此功能的正确方法是什么?
OpenXML文档不仅仅是一个XML文件(实际上,它是一个包含多个文件的ZIP档案,其中包括XML文件)。
您应该做的是修改WordprocessingDocument
,然后保存它(在using
块的末尾自动完成),而不是保存代表文档一部分的XML文件:
using (var wordDoc = WordprocessingDocument.Open(fileName, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
using (Stream partStream = mainPart.GetStream())
{
var xmlDoc = new XmlDocument();
using (XmlReader partXmlReader = XmlReader.Create(partStream))
xmlDoc.Load(partXmlReader);
//xml node manipulation here
partStream.Position = 0;
using (XmlWriter partXmlWriter = XmlWriter.Create(partStream))
xmlDoc.Save(partXmlWriter);
}
}
如果您成功执行了操作,您可以稍后在wordDoc
变量上使用Close()
将其保存回文件。MSDN声明这也保存了内容。
docx将是一个XML文件,而不是docx。
var xmlDoc = new XmlDocument();
...
xmlDoc.Save(@"E:'HelloWorld.docx");
您想要的是创建新的WordprocessingDocument,或者用您修改过的XML更新现有的Wordprocessing Document。
using (StreamWriter sw =
new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
xmlDoc.Save(sw);
}
请参阅MSDN中的更多示例:http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.document.aspx