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
即可。 .
我正在解析(使用 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
即可。 .