はじめに


golangのxml.Marshalでcdataを含ませたい時に少しハマったので備忘録.(cdataとは)

実装しながら解説


通常のcdata埋め込み


type Test1 struct {
	MyTag string `xml:",cdata"` // ← `xml:",charadata"`と同様にMyTagというタグは生成されない
}

func Marshal1() {
	byte, _ := xml.Marshal(Test1{"Test1CDATA"})
	fmt.Println(string(byte))
	// <Test1><![CDATA[Test1CDATA]]></Test1>
}

タグ内のcdata埋め込み


type (
	CDATAString struct {
		CDATA string `xml:",cdata"`
	}

	Test2 struct {
		MyTag CDATAString
	}
)

func Marshal2() {
	byte, _ := xml.Marshal(Test2{CDATAString{"Test2CDATA"}})
	fmt.Println(string(byte))
	// <Test2><MyTag><![CDATA[Test2CDATA]]></MyTag></Test2>
}

cdataを囲むタグ名を自由に変更したければ以下の方法で可能.

type (
	CDATAString struct {
		CDATA string `xml:",cdata"`
	}

	Test3 struct {
		MyTag CDATAString `xml:"my_tag"`
	}
)

func Marshal3() {
	byte, _ := xml.Marshal(Test3{CDATAString{"Test3CDATA"}})
	fmt.Println(string(byte))
	// <Test3><my_tag><![CDATA[Test3CDATA]]></my_tag></Test3>
}

まとめ


忘れるとややこしくなるので備忘録でした.