|  | // Copyright 2018 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // +build ignore | 
|  |  | 
|  | package xml_test | 
|  |  | 
|  | import ( | 
|  | "encoding/xml" | 
|  | "fmt" | 
|  | "log" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | type Animal int | 
|  |  | 
|  | const ( | 
|  | Unknown Animal = iota | 
|  | Gopher | 
|  | Zebra | 
|  | ) | 
|  |  | 
|  | func (a *Animal) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { | 
|  | var s string | 
|  | if err := d.DecodeElement(&s, &start); err != nil { | 
|  | return err | 
|  | } | 
|  | switch strings.ToLower(s) { | 
|  | default: | 
|  | *a = Unknown | 
|  | case "gopher": | 
|  | *a = Gopher | 
|  | case "zebra": | 
|  | *a = Zebra | 
|  | } | 
|  |  | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func (a Animal) MarshalXML(e *xml.Encoder, start xml.StartElement) error { | 
|  | var s string | 
|  | switch a { | 
|  | default: | 
|  | s = "unknown" | 
|  | case Gopher: | 
|  | s = "gopher" | 
|  | case Zebra: | 
|  | s = "zebra" | 
|  | } | 
|  | return e.EncodeElement(s, start) | 
|  | } | 
|  |  | 
|  | func Example_customMarshalXML() { | 
|  | blob := ` | 
|  | <animals> | 
|  | <animal>gopher</animal> | 
|  | <animal>armadillo</animal> | 
|  | <animal>zebra</animal> | 
|  | <animal>unknown</animal> | 
|  | <animal>gopher</animal> | 
|  | <animal>bee</animal> | 
|  | <animal>gopher</animal> | 
|  | <animal>zebra</animal> | 
|  | </animals>` | 
|  | var zoo struct { | 
|  | Animals []Animal `xml:"animal"` | 
|  | } | 
|  | if err := xml.Unmarshal([]byte(blob), &zoo); err != nil { | 
|  | log.Fatal(err) | 
|  | } | 
|  |  | 
|  | census := make(map[Animal]int) | 
|  | for _, animal := range zoo.Animals { | 
|  | census[animal] += 1 | 
|  | } | 
|  |  | 
|  | fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras:  %d\n* Unknown: %d\n", | 
|  | census[Gopher], census[Zebra], census[Unknown]) | 
|  |  | 
|  | // Output: | 
|  | // Zoo Census: | 
|  | // * Gophers: 3 | 
|  | // * Zebras:  2 | 
|  | // * Unknown: 3 | 
|  | } |