OpenDocument 格式:按行解析和拆分文本

OpenDocument format: parse & split text by lines

我正在解析(使用 Groovy)从 LibreOffice .odt (Writer) 文件中获得的 content.xml。

我想确保将文件中的所有文本都收集起来,按换行符分隔。

在Java的org.w3c.dom.Node(或Groovy的groovy.util.Node)中有一种方法可以提取任何节点下的所有文本(dom.Node.getTextContent/util.Node.text)。对于最高节点,这将打印文件中的所有文本,但忽略换行符。

这让我假设我将不得不步行 (depth-first) 穿过结构,识别各个线路。

通过这样的结构解析我发现"local part" 的节点名称往往有文本是"p"(段落)和"h"(标题)。

我还假设 "p" 或 "h" 不能嵌套另一个 "p" 或 "h"(尽管我确信有一些复杂的嵌入式结构他们能...)。但是清楚地检查给定 "p" 下的任何 spans 将生成您已经从其祖先 "p" 节点获得的文本。

但是 "p" 和 "h" 是我唯一需要查看的 QName 吗?我应该如何处理嵌入结构的可能性(例如包含一些文本的图形)。

是否有某种技术可以让我逐个节点获得所有文本的完整列表,确保没有遗漏和 none 重复的文本?

做不到这一点,是否有 OpenDocument 格式的某些方面可以让我解决这个问题?有趣的是,brief overview at Wikip 中的示例在 "content.xml" 下仅使用了这两个 QName,"p" 和 "h"。

Tim Yates 的评论似乎是最好的方式。

除非有人objects我不会删除这个问题,因为似乎没有另一个类似的问题。

从第一个实验看来,org.odftoolkit.simple.TextDocument.getParagraphIterator() 将遍历所有段落,包括 "h" QNames(= 标题),还包括空段落。好兆头。

注意,这些 "paragraphs" 实际上可能是 multi-line 段落:在 Writer 文件中,"paragraph mark" 和 "newline" 是有区别的。然而,解决这个问题的方法非常简单:只需在换行符上拆分 Paragraph getTextContent() / (textContent 属性 for Groovy people) String 即可。 .