1

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

我想确保将文件中的所有文本都隐藏起来,并按换行符分割。

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

这让我假设我必须(深度优先)穿过结构,识别单独的线条。

通过这样的结构解析,我发现节点名称的“本地部分”往往有文本是“p”(段落)和“h”(标题)。

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

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

是否有一些技术可以让我获得所有文本的全面列表,逐个节点,确保没有文本被遗漏并且没有重复?

如果做不到这一点,OpenDocument 格式的某些方面是否可以让我解决这个问题?有趣的是,Wikip上“content.xml”下的简要概述中的示例只使用了这两个 QName,“p”和“h”。

4

1 回答 1

1

蒂姆耶茨的评论似乎是最好的方法。

除非有人反对,否则我不会删除这个问题,因为似乎没有其他人喜欢它。

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

请记住,这些“段落”实际上可能是多行段落:在 Writer 文件中,“段落标记”和“换行符”之间存在差异。但是,解决方案非常简单:只需在换行符上拆分 Paragraph getTextContent()/ (textContentGroovy 人的属性) ......String

于 2018-02-09T20:56:11.050 回答