<speak><voice name=\"en-US-JennyNeural\"><prosody rate=\"1\">aaaaaaaa<break time=\"5s\"/> bbbb. <br time=\"2s\"/>ccccccdddddddd </prosody></voice></speak>我使用这段代码来解析和获取:
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/>一样解析<br/>。
发布于 2022-08-12 08:49:27
假设您使用的是github.com/PuerkitoBio/goquery,它使用golang.org/x/net/html进行HTML解析,这是一个符合HTML 5的标记器和解析器。
<br>和<break>的解析方式不同,因为在HTML中,<br>是一个不能带有结束标记的标记,但<break>不是这样的标记。
如果希望goquery正确处理HTML,则必须为<break>使用显式结束标记,而不是自结束标记。
例如:而不是这样:
<break time="5s"/>您必须使用这个:
<break time="5s"></break>通过此更改,您的输出将是(在围棋游乐场上尝试它):
<speak><voice name="en-US-JennyNeural"><prosody rate="1">aaaaaaaa<break time="5s"></break> bbbb. <br time="2s"/>ccccccdddddddd </prosody></voice></speak>发布于 2022-08-17 02:52:44
d := xml.NewDecoder(strings.NewReader(text))
var writer bytes.Buffer
e := xml.NewEncoder(&writer)
for {
t, err := d.Token()
if err == io.EOF {
break
}
if err != nil {
return "", err
}
if t == nil {
break
}
switch se := t.(type) {
case xml.StartElement:
e.EncodeToken(se)
case xml.EndElement, xml.CharData, xml.Comment, xml.ProcInst, xml.Directive:
e.EncodeToken(se)
}
}
e.Flush()
return writer.String(), nilhttps://stackoverflow.com/questions/73328858
复制相似问题