| // 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. | |
| 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 | |
| } | |