为了账号安全,请及时绑定邮箱和手机立即绑定

golang 模板转义第一个字符

golang 模板转义第一个字符

Go
梦里花落0921 2021-11-01 17:20:08
我正在尝试使用标准模板包构建站点地图 XML 文件。但是第一个字符集“ < ”变成了“ < ”,使客户无法读取XML。package mainimport (    "bytes"    "fmt"    "html/template")const (    tmplStr = `{{define "indexSitemap"}}<?xml version="1.0" encoding="UTF-8"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap>    <loc>https://www.test.com/sitemap.xml</loc></sitemap><sitemap>    <loc>https://www.test.com/events-sitemap.xml</loc></sitemap><sitemap>    <loc>https://www.test.com/gamesAndTeams-sitemap.xml</loc></sitemap></sitemapindex>{{end}}`)func main() {    // Parse the template and check for error    tmpl, parseErr := template.New("test").Parse(tmplStr)    if parseErr != nil {        fmt.Println(parseErr)        return    }    // Init the writer    buf := new(bytes.Buffer)    // Execute and get the template error if any    tmplExErr := tmpl.ExecuteTemplate(buf, "indexSitemap", nil)    if tmplExErr != nil {        fmt.Println(tmplExErr)        return    }    // Print the content malformed    fmt.Println(buf)}这是正常的吗?我怎样才能让它正常工作。
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

您的示例显示您正在使用该html/template包,它会自动转义 html 使用的文本。

如果您想要一个原始模板引擎,请改用该text/template包 - html 只是使用上下文感知转义来包装它。

但是,您需要自己确保使用原始模板引擎输出的文本是 XML 安全的。您可以通过escape向模板公开一些函数并通过此函数传递所有文本而不是直接编写它们来实现此目的。

[编辑]它看起来像一个错误html/template,如果你?从 xml 声明中省略它,它工作正常。但我的建议仍然有效——如果它不是 html,你最好使用这个text/template包。实际上,更好的是,将站点地图描述为结构体,根本不使用模板,仅使用 XML 序列化。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信