MS Word разбивает слова в своем формате XML - PullRequest
1 голос
/ 13 ноября 2009

У меня есть документ Word 2003, сохраненный в виде XML в формате WordProcessingML. Он содержит несколько заполнителей, которые будут динамически заменены соответствующим контентом. Но проблема в том, что 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>
...

Есть ли способ сохранить «чистый» XML-документ с помощью Word 2003 или существует какое-либо существующее решение, способное выполнить очистку?

Я пытался запрограммировать метод на Java, который объединит отдельные части заполнителей, но поскольку число различных комбинаций вырезывания относительно велико, алгоритм для этого гораздо сложнее, чем исходная задача, которую мне нужно сделать так что это проблема для себя.

Ответы [ 3 ]

3 голосов
/ 17 ноября 2009

Если вы контролируете исходные документы 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.

2 голосов
/ 21 января 2010

Вы можете использовать Aspose.Words и вызвать это:

Document.JoinRunsWithSameFormatting.

http://www.aspose.com/documentation/.net-components/aspose.words-for-.net-and-java/aspose.words.document.joinrunswithsameformatting.html

1 голос
/ 13 ноября 2009

Word 2003 XML необычайно сложен и труден для декодирования. Причина, по которой вы получаете несколько тегов, в том, что Word ML генерирует теги, называемые прогонами (тег w: r). Насколько я знаю, нет простого способа очистить XML выше. Я бы порекомендовал использовать HTML вместо WordML. Это намного проще манипулировать и заменять ваши заполнители на соответствующий контент. Если стоимость не является целью, используйте такой продукт, как Aspose. Он делает все для вас и прост в использовании.

...