我有以下结构:
type XMLProduct struct {
XMLName xml.Name `xml:"row"`
ProductId string `xml:"product_id"`
ProductName string `xml:"product_name"`
OriginalPrice string `xml:"original_price"`
BargainPrice string `xml:"bargain_price"`
TotalReviewCount int `xml:"total_review_count"`
AverageScore float64 `xml:"average_score"`
}
我使用 encoding/xml
对其进行编码,然后将其显示在网页上。
ProductName
字段需要用 <![CDATA[]]
括起来.但是如果我把它写成 <![CDATA[ + p.ProductName + ]]>
, <
和 >
将被翻译成 <
和 >
.
如何创建 CDATA
以最低的成本?
最佳答案
@spirit-zhang:从 Go 1.6 开始,你现在可以使用 ,cdata
标签了:
package main
import (
"fmt"
"encoding/xml"
)
type RootElement struct {
XMLName xml.Name `xml:"root"`
Summary *Summary `xml:"summary"`
}
type Summary struct {
XMLName xml.Name `xml:"summary"`
Text string `xml:",cdata"`
}
func main() {
cdata := `<a href="http://example.org">My Example Website</a>`
v := RootElement{
Summary: &Summary{
Text: cdata,
},
}
b, err := xml.MarshalIndent(v, "", " ")
if err != nil {
fmt.Println("oopsie:", err)
return
}
fmt.Println(string(b))
}
输出:
<root>
<summary><![CDATA[<a href="http://example.org">My Example Website</a>]]></summary>
</root>
Playground :https://play.golang.org/p/xRn6fe0ilj
规则基本上是:1)必须是,cdata
,不能指定节点名2)使用xml.Name
来命名节点随心所欲。
这就是如今大多数 Go 1.6+ 和 XML 的自定义内容的工作方式(带有 xml.Name
的嵌入式结构)。
编辑:添加 xml:"summary"
到 RootElement
结构,所以你也可以 Unmarshal
xml 回到结构反向(需要在两个地方都设置)。
关于xml - 如何使用 go 创建 xml 的 CDATA 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191596/