...
Source file
src/encoding/xml/example_text_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 Size int
15
16 const (
17 Unrecognized Size = iota
18 Small
19 Large
20 )
21
22 func (s *Size) UnmarshalText(text []byte) error {
23 switch strings.ToLower(string(text)) {
24 default:
25 *s = Unrecognized
26 case "small":
27 *s = Small
28 case "large":
29 *s = Large
30 }
31 return nil
32 }
33
34 func (s Size) MarshalText() ([]byte, error) {
35 var name string
36 switch s {
37 default:
38 name = "unrecognized"
39 case Small:
40 name = "small"
41 case Large:
42 name = "large"
43 }
44 return []byte(name), nil
45 }
46
47 func Example_textMarshalXML() {
48 blob := `
49 <sizes>
50 <size>small</size>
51 <size>regular</size>
52 <size>large</size>
53 <size>unrecognized</size>
54 <size>small</size>
55 <size>normal</size>
56 <size>small</size>
57 <size>large</size>
58 </sizes>`
59 var inventory struct {
60 Sizes []Size `xml:"size"`
61 }
62 if err := xml.Unmarshal([]byte(blob), &inventory); err != nil {
63 log.Fatal(err)
64 }
65
66 counts := make(map[Size]int)
67 for _, size := range inventory.Sizes {
68 counts[size] += 1
69 }
70
71 fmt.Printf("Inventory Counts:\n* Small: %d\n* Large: %d\n* Unrecognized: %d\n",
72 counts[Small], counts[Large], counts[Unrecognized])
73
74
75
76
77
78
79 }
80
View as plain text