Формат 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
на символе новой строки...