打开XML - 不正确的格式

时间:2010-08-27 11:12:24

标签: ms-word openxml

关于this post我一直在使用Word的Open XML和可用的库。大多数人似乎都不知道的是,有一些很好的resources以编程方式处理Word的Open XML格式(我并不是指手动将XML写入文件流!)。

我的问题是关于我正在做的事情。基本上,我是手动创建邮件合并。现在,邮件合并实际上工作正常,但不能正常工作的是将邮件合并字段放在文档中。这就是我正在做的事情:

string mergeFieldName = m.Value.Replace("[", string.Empty).Replace("]", string.Empty);
Body body = new Body();
DocumentFormat.OpenXml.Wordprocessing.Paragraph p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph();
SimpleField simpleField = new SimpleField() { Instruction = " MERGEFIELD " + mergeFieldName + " " };
Run run = new Run();
RunProperties runProperties = new RunProperties();
NoProof noProof = new NoProof();
runProperties.Append(noProof);
Text text = new Text("«" + mergeFieldName + "»");
run.Append(runProperties);
run.Append(text);
simpleField.Append(run);
p.Append(simpleField);
body.Append(p);

docXml.InnerXml = docXml.InnerXml.Replace(m.Value, body.InnerXml);

变量m实际上是一个Match对象,它基于我的正则表达式,匹配方括号内的所有内容。 (你可能想知道我为什么这样做,就像我一样 - 这里没有关系)

我的问题是生成的XML无效,因为我有以下内容:

<w:p w:rsidR="00945DC1" w:rsidRDefault="006878CA">
  <w:r>
    <w:t xml:space="preserve">
      <w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <w:fldSimple w:instr=" MERGEFIELD FullName ">
          <w:r>
            <w:rPr>
              <w:noProof />
            </w:rPr>
            <w:t>«FullName»</w:t>
          </w:r>
        </w:fldSimple>
      </w:p>
    </w:t>
  </w:r>
</w:p>

这是一个从手动创建的文档中使用XML的示例:

<w:p w:rsidR="001B2242" w:rsidRDefault="001B2242">
  <w:r>
    <w:tab/>
  </w:r>
  <w:fldSimple w:instr=" MERGEFIELD &quot;SalutationName&quot; ">
    <w:r>
      <w:rPr>
        <w:noProof/>
      </w:rPr>
      <w:t>«SalutationName»</w:t>
    </w:r>
  </w:fldSimple>
</w:p>

我得到的实际错误是“因为内容有问题而无法打开文件”。如果我不写出邮件合并字段,加载文档,然后插入邮件合并字段,它的工作原理。所以实际的邮件合并是正确的,它只是不正确的邮件合并字段。 (请参阅我的参考文章,了解如何合并邮件)。

关于这个的任何想法?

干杯

1 个答案:

答案 0 :(得分:0)

我看到的是你错了。你正在把你正在创建的新XML放在一个w:t标签里面,这是一个文本标签如果我没有弄错的话

跳过Body创建并用m.Values parent的innerXml替换Paragraph p的InnerXml。

如果我正确地理解了这一点。