golang 模板转义第一个字符

我正在尝试使用标准模板包构建站点地图 XML 文件。

但是第一个字符集“ < ”变成了“ < ”,使客户无法读取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)

}


这是正常的吗?

我怎样才能让它正常工作。


梦里花落0921
浏览 233回答 2
2回答

慕村9548890

您的示例显示您正在使用该html/template包,它会自动转义 html 使用的文本。如果您想要一个原始模板引擎,请改用该text/template包 - html 只是使用上下文感知转义来包装它。但是,您需要自己确保使用原始模板引擎输出的文本是 XML 安全的。您可以通过escape向模板公开一些函数并通过此函数传递所有文本而不是直接编写它们来实现此目的。[编辑]它看起来像一个错误html/template,如果你?从 xml 声明中省略它,它工作正常。但我的建议仍然有效——如果它不是 html,你最好使用这个text/template包。实际上,更好的是,将站点地图描述为结构体,根本不使用模板,仅使用 XML 序列化。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go