当使用open xml时,我的文件被破坏了

时间:2016-10-17 20:35:43

标签: c# xml

编辑: 问题现在解决了,就是有一个名为'name'的xml代码我不小心改变了。解决方案是在docx文件中有一个模糊的名称

我正在创建一个使用open xml修改word文档的程序,但是每次程序运行时文件都会损坏,我不知道为什么或者有什么方法可以解决它?

我看了一眼,我看到的一件事也确定我已经关闭了连接但是我尝试了但是我不确定连接是否仍然打开

编辑:

输出文件表示它已损坏,但当ms文件中的恢复运行文件时应该是

来自图片/代码 原始文件被复制到temp.docx并在文件

中有“name”

我要求程序用另一个单词替换“name”。

程序正在半工作,因为它改变了文档的值,但是它正在破坏文档。

链接到照片:https://drive.google.com/open?id=0B130JvN0ZPPRODJpZWZENTNUX0E

CODE

private void gen_btn_Click(object sender, EventArgs e)
    {

        if (System.IO.File.Exists(@"C:\invoices\temp.docx"))
        {
            // Use a try block to catch IOExceptions, to 
            // handle the case of the file already being 
            // opened by another process. 
            try
            {
                System.IO.File.Delete(@"C:\invoices\temp.docx");
            }
            catch (System.IO.IOException exception)
            {
                Console.WriteLine(exception.Message);
                return;
            }
        }
        File.Copy(@"C:\invoices\template.docx", @"C:\invoices\temp.docx");
        SearchAndReplace("name", "asdsadsadasdasdas");
    }

   public static void SearchAndReplace(string wordtoreplace, string replace)

    {
        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"C:\invoices\temp.docx", true))
        {
            string docText = null;
            using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }

            //Regex regexText = new Regex(wordtoreplace);
            docText = docText.Replace(wordtoreplace, replace);

            using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
            {
                sw.Write(docText);

            }
            wordDoc.Close();


        }
    }

1 个答案:

答案 0 :(得分:0)

问题是您要打开的文档流是XML文档。它包含的内容远远多于文档中输入的单词。有一些名为" name"的XML属性。正在被代码替换,这使得文档不再针对模式进行验证。

如果您使用更多唯一字词,则可以继续执行纯文本替换。例如,如果您的搜索字词是" asdf",那么替换它会非常安全,因为该值不会出现在XML架构中。

要正确执行此操作,您需要解析XML文档。包含实际文本的XML元素名为" w:t"。如果你遍历所有的" w:t" XML元素,你可以在他们的" InnerText"上替换你的纯文本。值。这将保证您的XML保持有效。

请注意,如果您尝试直接解析XML,仍会遇到问题...如果您键入令牌文本("名称"在这种情况下),则应用某种格式(如粗体) )到了单词的中间,你将无法再找到" name"在一个单一的" w:t"元件。通过应用格式,文本" name"将被分解成多个" w:t"元素。为了在我的项目中实现这一点,我应用了一个合并" w:t"在我搜索令牌之前的元素。这里的诀窍是知道何时由于格式差异而无法合并元素。