简化/清理DOCX word文档的XML

时间:2011-10-13 10:45:11

标签: c# xml ms-word openxml openxml-sdk

我有一个Microsoft Word文档(docx),我使用Open XML SDK 2.0 Productivity Tool从中生成C#代码。

我想以编程方式将一些数据库值插入到文档中。 为此我输入了简单的文本,如 [[place holder 1]] ,我的程序应该用它的数据库值替换占位符。

不幸的是,XML输出处于某种混乱状态。例如。我有一个带有两个相邻单元格的表格,它们不应与其占位符区分开来。但其中一个占位符是分裂的 进入几次。

[[好地方持有人]]

<w:tc xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tcPr>
    <w:tcW w:w="1798" w:type="dxa" />
    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
  </w:tcPr>
  <w:p w:rsidRPr="008C2E16" w:rsidR="001F54BF" w:rsidP="000D7B67" w:rsidRDefault="0009453E">
    <w:pPr>
      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="0009453E">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>[[good place holder]]</w:t>
    </w:r>
  </w:p>
</w:tc>

[[不好的地方持有人]]

<w:tc xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tcPr>
    <w:tcW w:w="1799" w:type="dxa" />
    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
  </w:tcPr>
  <w:p w:rsidRPr="008C2E16" w:rsidR="001F54BF" w:rsidP="000D7B67" w:rsidRDefault="00EA211A">
    <w:pPr>
      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>[[</w:t>
    </w:r>
    <w:proofErr w:type="spellStart" />
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>bad</w:t>
    </w:r>
    <w:proofErr w:type="spellEnd" />
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t xml:space="preserve"> place holder]]</w:t>
    </w:r>
  </w:p>
</w:tc>

是否有可能让Microsoft Word清理我的文档,以便所有占位符都能在生成的XML中识别?

4 个答案:

答案 0 :(得分:14)

我找到了一个解决方案:Open XML PowerTools Markup Simplifier。

我按照http://ericwhite.com/blog/2011/03/09/getting-started-with-open-xml-powertools-markup-simplifier/中描述的步骤进行操作,但它不能以1:1的方式工作(也许是因为它现在是Power Tools的2.2版本?)。所以,我在“Release”模式下编译PowerTools 2.2,并在我的 TestMarkupSimplifier.csproj 中引用了 OpenXmlPowerTools.dll 。在Program.cs中,我只更改了DOCX文件的路径。 我运行了一次程序,我的文档现在看起来相当干净。

引自Eric的博客的代码在上面的链接中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenXmlPowerTools;
using DocumentFormat.OpenXml.Packaging;

class Program
{
    static void Main(string[] args)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {
                RemoveComments = true,
                RemoveContentControls = true,
                RemoveEndAndFootNotes = true,
                RemoveFieldCodes = false
                RemoveLastRenderedPageBreak = true,
                RemovePermissions = true,
                RemoveProof = true,
                RemoveRsidInfo = true,
                RemoveSmartTags = true,
                RemoveSoftHyphens = true,
                ReplaceTabsWithSpaces = true,
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }
    }
}

答案 1 :(得分:1)

我不知道清理XML的方法,但我总是使用#placeholder作为我的占位符文本,这似乎比我尝试过的任何其他占位符文本保持一次运行。过去。看似占位符文本越长,分割成多次运行的可能性就越大。

答案 2 :(得分:1)

您需要摆脱Rsid信息。根据这个page Rsid信息

  

启用合并两个已分叉的文档。

您需要安装才能运行下面的示例代码。最简单的方法是在程序包管理器控制台中运行以下命令

Install-Package OpenXmlPowerTools

然后您将全部设置为运行以下代码。 (假设您已经在文档中添加了&#34; Test.docx&#34;文件。如果您使用的是Visual Studio,则需要确保在Debug或Release文件夹中有该文件的副本根据你的构建模式。)

//Sample code to remove Rsid information from a "Test.docx" document

 using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {  
                RemoveRsidInfo = true 
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }

这将删除在操作Word文件的过程中可能妨碍的Rsid信息。

答案 3 :(得分:0)

对于那些寻找手动非程序化解决方案的人:

http://www.translationtribulations.com/2010/06/cleaning-up-superfluous-tags-in-docx.html

我已经测试过memoQ 2014的免费试用版确实可以用作清理Word拼写代码的大型解决方法。

仍然在寻找一种更容易开箱即用的工具。