Сохранение документа XML приводит к повреждению файла - PullRequest
2 голосов
/ 23 марта 2012

У меня есть вопрос о том, как сохранить xmldoc в виде файла слов.Я хочу открыть файл word, выполнить некоторые манипуляции с недопустимой структурой xml с помощью класса xmldocument, а затем снова сохранить его в файле 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 ]

2 голосов
/ 23 марта 2012

Документ 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);
    }
}
0 голосов
/ 23 марта 2012

docx будет XML-файлом, а не DOCX.

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

Вам нужно либо создать новый WordprocessingDocument, либо обновить существующий с помощью XML, который вы изменили. Нечто подобное

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

0 голосов
/ 23 марта 2012

Если вы успешно выполнили манипуляцию, вы можете позже сохранить ее в файл, используя Close() в вашей переменной wordDoc. В MSDN говорится, что это также сохраняет содержимое.

...