我正在尝试使用标准模板包构建站点地图XML文件 但第一个字符集“< ”变为“& lt; ”,并使客户端无法读取XML。
package main
import (
"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)
}
这是正常的吗? 我怎样才能使它正常工作。
提前致谢
答案 0 :(得分:2)
您的示例显示您正在使用html/template
程序包,该程序包会自动转义html用法的文本。
如果你想要一个原始的模板引擎,请使用text/template
包 - html只需用上下文感知转义包装它。
但是,您需要自己确保使用原始模板引擎输出的文本是XML安全的。您可以通过向模板公开一些escape
函数,并通过此函数传递所有文本而不是直接编写它们来完成此操作。
[编辑] 它看起来像html/template
中的错误,如果你从xml声明中省略?
它就可以了。但我的建议仍然存在 - 如果它不是html你最好使用text/template
包。实际上,更好的是,将站点地图描述为结构,并且根本不使用模板,只是XML序列化。
答案 1 :(得分:1)
另请参阅github上的问题#12496,确认他们不打算解决这个问题。
https://github.com/golang/go/issues/12496
可能是因为这是HTML模板包而你正在尝试 生成XML。我怀疑它不知道如何解析 带有问号的指令。
您可能想要使用文本/模板包,如果您是 不会利用任何HTML自动转义功能 特征