You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:14:49