我将Word 2003文档保存为WordProcessingML格式的XML。它包含几个占位符,它们将被适当的内容动态替换。 但是,问题在于Word似乎随机地将它们分成单独的单词。例如,而不是:
<w:t>${dl.d.out.ecs_rev}</w:t>
我有这个:
...
<w:t>${</w:t>
</w:r>
<w:r wsp:rsidR="005D11C0">
<w:rPr>
<w:sz w:val="20" />
<w:sz-cs w:val="20" />
</w:rPr>
<w:t>dl.</w:t>
</w:r>
<w:r wsp:rsidRPr="00696324">
<w:rPr>
<w:sz w:val="20" />
<w:sz-cs w:val="20" />
</w:rPr>
<w:t>d.out.ecs_rev}</w:t>
...
有没有办法使用Word 2003保存“干净”的XML文档,还是有任何可以进行清理的现有解决方案?
我尝试在Java中编写一个方法来连接占位符的分离部分,但由于不同切割组合的数量相对较大,因此算法要比我必须做的原始任务复杂得多,所以它本身就是问题。
答案 0 :(得分:3)
如果您可以控制原始Word文档,则可以阻止Word插入rsid并突出显示语法/拼写错误。
Word.Options opts = Word.Options;
opts.CheckGrammarAsYouType = false;
opts.CheckGrammarWithSpelling = false;
opts.CheckSpellingAsYouType = false;
opts.StoreRSIDOnSave = false;
如果你在单词中改变字体,那么单词仍会被拆分。
嗯,我有一个简单+丑陋的xslt,我用它来清理WordML,就像你发布的例子一样。如果你愿意,我可以将它提交给docx4j,但正如你所说,有各种组合不会被覆盖。无论如何,如果你想要它,请发布到docx4j论坛。
更健壮的方法是提取纯文本,并将纯文本与XML相关联,这样您就可以搜索纯文本,然后从那里转到XML。
答案 1 :(得分:2)
您可以使用Aspose.Words并调用它:
Document.JoinRunsWithSameFormatting。
答案 2 :(得分:1)
Word 2003 XML异常复杂且难以解码。获得多个标签的原因是因为Word ML生成了名为runs的标签(w:r标签)。据我所知,没有简单的方法来清理上面的XML。我建议使用HTML而不是WordML。使用适当的内容操作和替换占位符更容易。 如果成本不是目标,请使用像Aspose这样的产品。它为您完成所有事情并且易于使用。