14

私は次の構造体を持っています:

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てこれをエンコードし、Web ページに表示します。

フィールドはProductNameで囲む必要があります<![CDATA[]]。しかし、 と書くと<![CDATA[ + p.ProductName + ]]><and>は and に変換され&lt;ます&gt;

CDATA最小限のコストでを作成するにはどうすればよいですか?

4

6 に答える 6

3

@Tomalak が述べたように、CDATA の出力はサポートされていません。

おそらく![CDATA[xmlタグとして記述し、後で結果のxmlから終了タグを置き換えることができます。これはうまくいきますか?おそらく最小コストのものではありませんが、最も簡単です。もちろん、以下の例では、MarshalIndent 呼び出しを Marshal 呼び出しだけに置き換えることができます。

http://play.golang.org/p/2-u7H85-wn

package main

import (
    "encoding/xml"
    "fmt"
    "bytes"
)

type XMLProduct struct {
    XMLName          xml.Name `xml:"row"`
    ProductId        string   `xml:"product_id"`
    ProductName      string   `xml:"![CDATA["`
    OriginalPrice    string   `xml:"original_price"`
    BargainPrice     string   `xml:"bargain_price"`
    TotalReviewCount int      `xml:"total_review_count"`
    AverageScore     float64  `xml:"average_score"`
}

func main() {
    prod := XMLProduct{
        ProductId:        "ProductId",
        ProductName:      "ProductName",
        OriginalPrice:    "OriginalPrice",
        BargainPrice:     "BargainPrice",
        TotalReviewCount: 20,
        AverageScore:     2.1}

    out, err := xml.MarshalIndent(prod, " ", "  ")
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }

    out = bytes.Replace(out, []byte("<![CDATA[>"), []byte("<![CDATA["), -1)
    out = bytes.Replace(out, []byte("</![CDATA[>"), []byte("]]>"), -1)
    fmt.Println(string(out))
}
于 2013-01-07T15:28:34.877 に答える
0

Go バージョン 1.6 以降を使用している場合は、'cdata' タグを追加するだけで問題なく動作します。

type XMLProduct struct {
    XMLName          xml.Name `xml:"row"`
    ProductId        string   `xml:"product_id"`
    ProductName      string   `xml:"product_name,cdata"`
    OriginalPrice    string   `xml:"original_price"`
    BargainPrice     string   `xml:"bargain_price"`
    TotalReviewCount int      `xml:"total_review_count"`
    AverageScore     float64  `xml:"average_score"`
}
于 2016-06-29T05:35:35.413 に答える