使用Groovy解析LibreOffice ODT文件content.xml并按行拆分文本
用Groovy解析ODT的content.xml并保留换行提取文本
我之前处理ODT文件的时候也踩过这个坑!直接调用根节点的text或者getTextContent()确实会把所有文本揉成一团,完全忽略掉换行——因为ODT里的换行和段落分隔都是靠特定XML元素标记的,不是文本里的\n,所以必须手动遍历节点来识别这些标记。
下面是我当时写的深度优先遍历实现,用Groovy的groovy.util.Node来处理,能准确捕捉换行和段落:
def extractTextWithLineBreaks(Node node) { def result = new StringBuilder() node.children().each { child -> if (child instanceof String) { // 处理文本节点,直接追加内容 result.append(child.trim()) } else if (child instanceof Node) { def nodeName = child.name() // 识别手动换行元素 if (nodeName == 'text:line-break') { result.append('\n') } // 处理段落节点,遍历子节点后追加段落换行 else if (nodeName == 'text:p') { result.append(extractTextWithLineBreaks(child)) result.append('\n') } // 其他容器元素继续递归遍历 else { result.append(extractTextWithLineBreaks(child)) } } } return result.toString() }
关键细节说明:
- ODT的content.xml里,
<text:line-break/>对应文档里的手动换行,<text:p>对应段落分隔,这两类元素是我们需要转换成\n的核心标记。 - 递归遍历所有子节点,遇到纯文本节点就追加内容,遇到换行元素直接插入
\n,段落节点处理完内部文本后再加一个换行(保证段落之间的分隔)。 - 代码里的
trim()是为了去掉ODT文本节点自带的多余空格,如果你需要完全保留原文档的空格格式,可以去掉这个方法调用。
使用示例:
先把content.xml解析成Groovy的Node对象,再调用上面的方法即可:
def contentXml = new XmlParser().parse(new File('path/to/your/content.xml')) def extractedText = extractTextWithLineBreaks(contentXml) // 按换行拆分得到每行文本 def lines = extractedText.split('\n') lines.each { println it }
这样提取出来的文本就会完整保留原文档的换行和段落结构,拆分后的lines数组也和原文档的行/段落对应上了。
内容的提问来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

