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

时间:2012-03-23 15:53:55

标签: c# xml openxml

我有一个关于如何将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");
                 }

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

3 个答案:

答案 0 :(得分:2)

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);
    }
}

答案 1 :(得分:0)

如果您已成功执行了操作,则可以稍后使用wordDoc变量上的Close()将其保存回文件。 MSDN声明这也保存了内容。

答案 2 :(得分:0)

docx将是一个XML文件,而不是DOCX。

var xmlDoc = new XmlDocument();
... 
xmlDoc.Save(@"E:\HelloWorld.docx");

您想要的是创建新的WordprocessingDocument或使用您修改的XML更新现有的WordprocessingDocument。一些事情

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