Source file
src/encoding/xml/example_marshaling_test.go
1
2
3
4
5 package xml_test
6
7 import (
8 "encoding/xml"
9 "fmt"
10 "log"
11 "strings"
12 )
13
14 type Animal int
15
16 const (
17 Unknown Animal = iota
18 Gopher
19 Zebra
20 )
21
22 func (a *Animal) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
23 var s string
24 if err := d.DecodeElement(&s, &start); err != nil {
25 return err
26 }
27 switch strings.ToLower(s) {
28 default:
29 *a = Unknown
30 case "gopher":
31 *a = Gopher
32 case "zebra":
33 *a = Zebra
34 }
35
36 return nil
37 }
38
39 func (a Animal) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
40 var s string
41 switch a {
42 default:
43 s = "unknown"
44 case Gopher:
45 s = "gopher"
46 case Zebra:
47 s = "zebra"
48 }
49 return e.EncodeElement(s, start)
50 }
51
52 func Example_customMarshalXML() {
53 blob := `
54 <animals>
55 <animal>gopher</animal>
56 <animal>armadillo</animal>
57 <animal>zebra</animal>
58 <animal>unknown</animal>
59 <animal>gopher</animal>
60 <animal>bee</animal>
61 <animal>gopher</animal>
62 <animal>zebra</animal>
63 </animals>`
64 var zoo struct {
65 Animals []Animal `xml:"animal"`
66 }
67 if err := xml.Unmarshal([]byte(blob), &zoo); err != nil {
68 log.Fatal(err)
69 }
70
71 census := make(map[Animal]int)
72 for _, animal := range zoo.Animals {
73 census[animal] += 1
74 }
75
76 fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras: %d\n* Unknown: %d\n",
77 census[Gopher], census[Zebra], census[Unknown])
78
79
80
81
82
83
84 }
85
View as plain text