2012-03-23 108 views
2

我對如何將xmlDoc中保存爲word文件的問題。我想打開word文件,使用xmldocument類對未定義的xml結構進行一些操作,然後將其重新保存回word文件。這是我目前正在做的事情:保存XML文檔導致損壞的文件

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

但是這會導致一個損壞的文檔。什麼是正確的方法來做這個功能?

+0

莫非請您發表評論什麼是腐敗,你所期望的:HelloWorld.Test將是一個XML文件,而不是DOCX,因此是無效的XML XML或HelloWorld.docx損壞或您希望HelloWorld.Test是一個worrd文件? – 2012-03-23 16:12:51

+0

sry,這是一個錯字。我試圖打開一個docx,使用xmldoc來提取xml結構,修改它,然後將它寫回到另一個docx文件。所以HelloWorld應該是一個docx – 2012-03-23 16:21:07

回答

2

OpenXML文檔不僅僅是一個XML文件的更多(實際上,它是一個包含其中的幾個文件,XML文件的ZIP壓縮文件)。

你應該做的是修改你的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

林不知道如果這個方法還是用我的XML操作代碼,多數民衆贊成在故障不對勁,因爲我看不到任何變化。基本上在操作部分,我試圖從文檔中刪除幾個運行,但他們仍然顯示在最後。 – 2012-03-23 17:41:04

+0

@JohnBaum,這段代碼適合我。你確定你正在使用它,就像我寫的一樣(重置流的位置,然後將XML寫入它)?除非你對我們有幫助,否則我們無法幫助你處理你的代碼。你應該問另一個問題,並把你的代碼放在那裏。 – svick 2012-03-23 18:13:04

+0

這裏是代碼:http://pastebin.com/szzJ54mE – 2012-03-23 18:43:35

0

如果您已成功執行的操作,你可以爲以後節省回到你wordDoc使用可變Close()到文件。 MSDN聲明這也保存了內容。

+0

這不起作用。在文檔中沒有看到更改 – 2012-03-23 16:54:31

+0

然後您可能實際上沒有修改文檔,請參閱我的答案。 – svick 2012-03-23 17:06:43

+0

我可以確保文件已修改嗎? – 2012-03-23 17:49:18

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

+0

這是否會用我的更改創建一個docx文件?它在哪裏創建它? – 2012-03-23 16:54:01

+0

MSDN示例顯示/說明如何操作,但請參閱svick的答案。 – 2012-03-23 17:26:43