Essential Go XML  Suggest an edit

Configuring XML parsing and serialization

You can modify how a struct is serialized to XML by annotating fields with tags.

By providing XMLName, this will be serialized as ... and not ...

type ShowXMLName struct {
	XMLName xml.Name `xml:"data"`
	N       int      `xml:"n"`
}

v := &ShowXMLName{
	N: 5,
}
printXML(v)
XML: <data><n>5</n></data>

Fields marked with xml:"-" are not serialized.

type ShowOmit struct {
	Name          string `xml:"name"`
	NotSerialized string `xml:"-"`
}

v := &ShowOmit{
	Name:          "John",
	NotSerialized: "Connor",
}
printXML(v)
XML: <ShowOmit><name>John</name></ShowOmit>

To skip serializing fields with empty values, use xml:",omitempty".

type ShowOmitEmpty struct {
	NonEmpty string `xml:",omitempty"`
	Empty    string `xml:",omitempty"`
}

v := &ShowOmitEmpty{
	NonEmpty: "non empty",
	Empty:    "",
}
printXML(v)
XML: <ShowOmitEmpty><NonEmpty>non empty</NonEmpty></ShowOmitEmpty>

To change serialization from XML element to XML attribute use xml:",attr".

type ShowAttr struct {
	B bool `xml:"n,attr"`
}

v := &ShowAttr{
	B: true,
}
printXML(v)
XML: <ShowAttr n="true"></ShowAttr>

To change serialization from XML element to character data use xml:",chardata".

type ShowCharData struct {
	S string `xml:",chardata"`
}

v := &ShowCharData{
	S: "str",
}
printXML(v)
XML: <ShowCharData>str</ShowCharData>

To change serialization from XML element to CDATA use xml:",cdata".

type ShowCData struct {
	S string `xml:",cdata"`
}

v := &ShowCData{
	S: "cdata",
}
printXML(v)
XML: <ShowCData><![CDATA[cdata]]></ShowCData>

To serialize the value verbatim, use xml:",innerxml".

type ShowInnerXML struct {
	Str string `xml:"s"`
	Raw string `xml:",innerxml"`
}

v := &ShowInnerXML{
	Str: "<foo></foo>",
	Raw: "<foo></foo>",
}
printXML(v)
XML: <ShowInnerXML><s>&lt;foo&gt;&lt;/foo&gt;</s><foo></foo></ShowInnerXML>

To serialize field as XML comment, use xml:",comment". Value can’t contain --.

type ShowComment struct {
	Str string `xml:",comment"`
}

v := &ShowComment{
	Str: "comment",
}
printXML(v)
XML: <ShowComment><!--comment--></ShowComment>

xml:"a>b>str" nests XML element. This also influences parsing.

type ShowNesting struct {
	Str string `xml:"a>b>str"`
}

v := &ShowNesting{
	Str: "str",
}
printXML(v)
XML: <ShowNesting><a><b><str>str</str></b></a></ShowNesting>

  ↑ ↓ to navigate     ↵ to select     Esc to close