// 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 Size int | |
const ( | |
Unrecognized Size = iota | |
Small | |
Large | |
) | |
func (s *Size) UnmarshalText(text []byte) error { | |
switch strings.ToLower(string(text)) { | |
default: | |
*s = Unrecognized | |
case "small": | |
*s = Small | |
case "large": | |
*s = Large | |
} | |
return nil | |
} | |
func (s Size) MarshalText() ([]byte, error) { | |
var name string | |
switch s { | |
default: | |
name = "unrecognized" | |
case Small: | |
name = "small" | |
case Large: | |
name = "large" | |
} | |
return []byte(name), nil | |
} | |
func Example_textMarshalXML() { | |
blob := ` | |
<sizes> | |
<size>small</size> | |
<size>regular</size> | |
<size>large</size> | |
<size>unrecognized</size> | |
<size>small</size> | |
<size>normal</size> | |
<size>small</size> | |
<size>large</size> | |
</sizes>` | |
var inventory struct { | |
Sizes []Size `xml:"size"` | |
} | |
if err := xml.Unmarshal([]byte(blob), &inventory); err != nil { | |
log.Fatal(err) | |
} | |
counts := make(map[Size]int) | |
for _, size := range inventory.Sizes { | |
counts[size] += 1 | |
} | |
fmt.Printf("Inventory Counts:\n* Small: %d\n* Large: %d\n* Unrecognized: %d\n", | |
counts[Small], counts[Large], counts[Unrecognized]) | |
// Output: | |
// Inventory Counts: | |
// * Small: 3 | |
// * Large: 2 | |
// * Unrecognized: 3 | |
} |