• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package xml_test
6
7import (
8	"encoding/xml"
9	"fmt"
10	"log"
11	"strings"
12)
13
14type Size int
15
16const (
17	Unrecognized Size = iota
18	Small
19	Large
20)
21
22func (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
34func (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
47func 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	// Output:
75	// Inventory Counts:
76	// * Small:        3
77	// * Large:        2
78	// * Unrecognized: 3
79}
80