OpenDocument格式:解析&按行

时间:2018-02-09 19:25:43

标签: java groovy xml-parsing libreoffice opendocument

我正在解析(使用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”(尽管有一些复杂的嵌入式结构我确信它们可以......)。但是,清楚地检查给定“p”下的任何spans将生成您已经从其祖先“p”节点获得的文本。

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

是否有一些技术可以让我逐个节点地获得所有文本的全面列表,确保没有错过任何文本而没有重复文本?

如果失败了,OpenDocument格式的某些方面可能让我解决这个问题吗?有趣的是,在“content.xml”下的brief overview at Wikip中的示例仅使用这两个QNames,“p”和“h”。

1 个答案:

答案 0 :(得分:1)

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

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

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

请记住这些"段落"实际上可能是多行段落:在一个Writer文件中,一段"段落标记"和#34;换行符"。对此的解决方案非常简单:只需在换行符上拆分Groovy人的getTextContent() /(textContent属性)String ...