Go's xml
package is excellent and makes dealing with XML very easy. There's one thing I'm not sure how to do: when creating an XML document from a native struct, how do you specify the doctype?
For example, these structs:
type Person struct {
XMLName xml.Name `xml:"person"`
FirstName string `xml:"firstName"`
MiddleName string `xml:"middleName"`
LastName string `xml:"lastName"`
Age int64 `xml:"age"`
Skills []Skill `xml:"skills"`
}
type Skill struct {
XMLName xml.Name `xml:"skill"`
Name string `xml:"skillName"`
YearsPracticed int64 `xml:"practice"`
}
Will generate something like this XML:
<person>
<firstName>Bob</firstName>
<middleName></middleName>
<lastName>Jones</middleName>
<age>23</age>
<skills>
<skill>
<skillName>Cooking</skillName>
<practice>3</practice>
</skill>
<skill>
<skillName>Basketball</skillName>
<practice>4</practice>
</skill>
</skills>
</person>
Which is great, but what do I do to get this:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<firstName>Bob</firstName>
<middleName></middleName>
...
It almost seems too simple, but is this a matter of doing a string append?
And, on the reverse, how would Go's XML parser handle a doctype in a block of text that you wanted to unmarshal into a set of structs? Ignore it?
Simply append your marshalled bytes to the header. As seen in the XML Package Source, a generic header is included:
const (
// A generic XML header suitable for use with the output of Marshal.
// This is not automatically added to any output of this package,
// it is provided as a convenience.
Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n"
)
So, this would do it:
myString, err := xml.MarshalIndent(...) // abbreviated here
myString = []byte(xml.Header + string(myString))
A working example I'd found (not my code) available at: http://play.golang.org/p/Rbfb717tvh