golang模板转义第一个char

时间:2015-09-01 13:44:14

标签: templates go

我正在尝试使用标准模板包构建站点地图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)
}

playground golang

这是正常的吗? 我怎样才能使它正常工作。

提前致谢

2 个答案:

答案 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自动转义功能   特征