Формат OpenDocument: разбирать и разбивать текст по строкам

Я анализирую (используя Groovy) файл content.xml, полученный из файла LibreOffice .odt (Writer).

Я хочу убедиться, что я нахожу весь текст в файле, разбивая его на разрывы строк.

В Java org.w3c.dom.Node (или Groovy's groovy.util.Node) есть способ забрать весь текст под любым узлом (dom.Node.getTextContent/util.Node.text). Для самого высокого узла будет напечатан весь текст в файле, но он игнорирует разрывы строк.

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

Анализируя такую ​​структуру, я обнаружил, что "локальной частью" имен узлов, которые, как правило, имеют текст, являются "p" (абзац) и "h" (заголовок).

Я также предполагаю, что "p" или "h" не могут вложить другое "p" или "h" (хотя с какой-то сложной встроенной структурой я уверен, что они могут...). Но четко изучив любой spans под заданным "p" будет сгенерирован текст, который вы уже получили от его предка "p".

Но являются ли "p" и "h" единственными QNames, на которые мне нужно посмотреть? Я, как я должен иметь дело с возможностью встроенных структур (например, графика, содержащая некоторый текст).

Есть ли какой-нибудь метод, с помощью которого я могу получить полный список всего текста, узел за узлом, гарантируя, что ни один текст не будет пропущен и не будет продублирован?

Если это не удастся, есть ли какой-то аспект формата OpenDocument, который может позволить мне решить это? Интересно, что в примере в кратком обзоре Wikip под "content.xml" используются только эти два QNames, "p" и "h".

1 ответ

Решение

Комментарий Тима Йейтса, кажется, лучший путь.

Если кто-то не возражает, я не буду удалять этот вопрос, потому что, похоже, нет другого, похожего на него.

Из первых экспериментов выясняется, что org.odftoolkit.simple.TextDocument.getParagraphIterator() будет проходить по всем параграфам, включая "h" QNames (= заголовки), а также включая пустые абзацы. Хороший знак.

Обратите внимание, что эти "абзацы" могут фактически быть многострочными абзацами: в файле Writer есть разница между "знаком абзаца" и "новой строкой". Решение этого вопроса очень простое: просто разделите абзац getTextContent() / (textContent собственность для Groovy людей) String на символе новой строки...

Другие вопросы по тегам