Как искать / заменять текст в WordprocessingML - PullRequest
2 голосов
/ 03 мая 2011

В WordprocessingML (формат, в котором сохраняются документы MS Word), есть ли возможность легко искать текст?

Основная проблема, с которой я сталкиваюсь, заключается в том, что формат WordprocessingML разбивает каждый абзац на «прогоны», например:

Чтобы сохранить предложение «Модуль 1: Заголовок некоторого раздела» , WordprocessingML определяет разметку XML:

  <w:p w:rsidR="00F9529C" w:rsidRDefault="00F9529C" w:rsidP="00F9529C">
   <w:pPr>
    <w:pStyle w:val="Heading1_5019"/>
   </w:pPr>
   <w:bookmarkStart w:id="0" w:name="_Toc247333659"/>
   <w:r>
    <w:t>M</w:t>
   </w:r>
   <w:r w:rsidRPr="007D2739">
    <w:t xml:space="preserve">odule 1: </w:t>
   </w:r>
   <w:r>
    <w:t>Some Section Title</w:t>
   </w:r>
   <w:bookmarkEnd w:id="0"/>
  </w:p>

Как вы можете видеть, предложение было разбито на " M ", " odule 1: ", " Some Title Title ". Такое расположение делает невозможным поиск предложения в целом. Есть ли способ обойти это?

Чтобы уточнить, я пытаюсь сделать это в PHP, используя DomDocument.

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Я написал пример кода, который показывает, как искать и заменять текст в документе Open XML WordprocessingML.Мой подход заключается в следующем: как только вы нашли абзац, содержащий текст, который необходимо заменить, вы разбиваете все серии абзаца на серии из одного символа.Тогда легко найти набор последовательных прогонов, которые соответствуют вашей строке поиска.Затем вы можете создать новый прогон с текстом замены, а затем удалить одиночные прогоны символов, соответствующие строке поиска.Я реализовал это с помощью XML DOM (используя System.Xml.XmlDocument).Пример кода можно найти в сообщении блога, Поиск и замена текста в документе Open XML WordprocessingML .Кроме того, я записал короткий скриншот, который показывает, как работает алгоритм: http://www.youtube.com/watch?v=w128hJUu3GM

0 голосов
/ 04 мая 2011

Да, это боль работы с WordML, скажем, с использованием объектной модели слова.

К сожалению, я не нашел ничего, что облегчает это (openxml sdk, Aspose и т. Д., Кажется, все, по сути, просто оборачивают WordML xml в тонкий шпон).

Вы МОЖЕТЕ выполнить некоторую ограниченную предварительную обработку на ML и разрешить множество вещей (например, все эти элементы rsidRPr и т. Д.), Но все еще будет сложно найти достаточно элементов форматирования, чтобы последовательно иметь возможность искать текст.

С другой стороны, вы можете использовать XPATH для извлечения просто элементов w: t, затем объединить их все вместе и искать результаты, но тогда у вас возникнет проблема, как узнать, где в документе вы на самом деле нашли то, что в итоге нашли живет.

если вас это не волнует (например, вы просто извлекаете данные), то это может быть самым быстрым решением.

...