我正在解析(使用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”。
答案 0 :(得分:1)
除非有人反对,否则我不会删除这个问题,因为似乎没有人喜欢它。
从第一次实验看,org.odftoolkit.simple.TextDocument.getParagraphIterator()
将遍历所有段落,包括" h" QNames(=标题),还包括空段落。一个好兆头。
请记住这些"段落"实际上可能是多行段落:在一个Writer文件中,一段"段落标记"和#34;换行符"。对此的解决方案非常简单:只需在换行符上拆分Groovy人的getTextContent()
/(textContent
属性)String
...