保存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");
                 }

然而,这会导致文档损坏。实现此功能的正确方法是什么?

保存xml文档会导致文件损坏

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