2012-03-23 21 views
2

xmldocを単語ファイルとして保存する方法について質問があります。私は、単語ファイルを開き、xmldocumentクラスを使用して、元気でないxml構造体について何らかの操作を行い、それを単語ファイルに戻したいと思います。これは私が現在行っているものです: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はdocxではなくXMLファイルであるため、XMLの無効なXMLやHelloWorld.docxが壊れているか、HelloWorld.Testがworrdドキュメントであることを期待していますか? –

+0

これはタイプミスです。私はdocxを開こうとしていますが、xmldocを使ってxml構造体を抽出し、それを修正して別のdocxファイルに書き戻します。 HelloWorldはdocx –

答えて

2

OpenXMLドキュメントには、(実際に、それはそれらの間のいくつかのファイル、XMLファイルを含むZIPアーカイブです)だけでXMLファイル以上のものです。あなたは何をすべき

は、文書の一部を表すXMLファイルを保存し、(usingブロックの終了時に自動的に行われている)ではない、あなたのWordprocessingDocumentを変更し、それを保存することです:

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操作コードでこのメソッドや何かが間違っているのかどうかわかりません。基本的に操作部分で、私は文書からいくつかの実行を削除しようとしているが、彼らはまだ最後に表示されます。 –

+0

@JohnBaum、このコードは私のために働く。あなたはそれを書いたとおりに正確に使用していますか(ストリームの 'Position'をリセットしてからXMLを書きます)?そして、私たちにどのようにしておかなければ、コードであなたを助けることはできません。おそらく別の質問をしてコードをそこに置くべきでしょう。 – svick

+0

ここにコードです:http://pastebin.com/szzJ54mE –

0

操作を正常に実行した場合は、後でwordDoc変数にClose()を使用してファイルに保存し直すことができます。 MSDNは、これもコンテンツを保存すると述べています。

+0

でなければなりません。文書内に変更はありません –

+0

それから実際には文書を修正していないでしょう、私の答えを見てください。 – svick

+0

文書が変更されたことを確認できますか? –

0

docxはDOCXではなくXMLファイルになります。

新しい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ファイルを作成しますか?それはどこに作成されますか? –

+0

MSDNのサンプルは、どのように表示するか説明しますが、svickの答えを参照してください。 –

関連する問題