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

使用goquery解析单元素时<break/>标签解析异常的解决方法

问题:SSML中<break/>标签被goquery错误转换为闭合标签形式

问题重现

原始SSML代码:

<speak><voice name="en-US-JennyNeural"><prosody rate="1">aaaaaaaa<break time="5s"/> bbbb. <br time="2s"/>ccccccdddddddd </prosody></voice></speak>

使用goquery解析的代码:

doc, err := goquery.NewDocumentFromReader(strings.NewReader(text))
if err != nil {
    return "", err
}
ssml, err := doc.Find("html body").Html()
if err != nil {
    return "", err
}

解析后错误结果:

<speak><voice name="en-US-JennyNeural"><prosody rate="1">aaaaaaaa<break time="5s"> bbbb. <br time="2s"/>ccccccdddddddd </break></prosody></voice></speak>

可见<break/>被转换为<break>...</break>的闭合形式,而<br/>保持正常自闭合状态。

原因分析

goquery依赖的golang.org/x/net/html解析器遵循HTML规范:

  • <br>是HTML标准定义的自闭合空元素,解析器会保留其自闭合形式
  • <break>是SSML专属标签,不在HTML标准空元素列表中,解析器将其视为普通容器标签,自动补全闭合标签。

解决方案

方案1:用XML解析器处理SSML(推荐)

SSML是XML的子集,使用Go标准库的encoding/xml解析能严格保留自闭合标签结构:

import (
    "encoding/xml"
    "strings"
)

func parseSSML(text string) (string, error) {
    // 定义结构体匹配speak根标签,保留内部原始XML内容
    var speakNode struct {
        XMLName xml.Name `xml:"speak"`
        InnerXML []byte   `xml:",innerxml"`
    }

    if err := xml.Unmarshal([]byte(text), &speakNode); err != nil {
        return "", err
    }

    // 重新拼接完整的SSML内容
    return "<speak>" + string(speakNode.InnerXML) + "</speak>", nil
}

方案2:字符串替换修正(简易场景)

如果SSML结构简单,可通过正则表达式替换错误转换的<break>标签:

import "regexp"

// ... 原有goquery解析代码 ...

ssml, err := doc.Find("html body").Html()
if err != nil {
    return "", err
}

// 匹配被错误闭合的break标签,替换回自闭合形式
re := regexp.MustCompile(`<break([^>]*)>(\s*)</break>`)
ssml = re.ReplaceAllString(ssml, `<break$1/>`)

方案3:自定义HTML解析器的空元素列表

修改golang.org/x/net/html的空元素列表,将<break>加入其中:

import "golang.org/x/net/html"

func init() {
    // 将break添加到HTML空元素集合
    html.EmptyElements["break"] = struct{}{}
}

注意:此方法会全局修改HTML解析器的行为,可能影响其他场景的解析,需谨慎使用。

内容的提问来源于stack exchange,提问作者invoker kael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:33:17