86 lines
1.5 KiB
Go
86 lines
1.5 KiB
Go
// 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 goxml_test
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"strings"
|
|
|
|
"git.pyer.club/kingecg/goxml"
|
|
)
|
|
|
|
type Animal int
|
|
|
|
const (
|
|
Unknown Animal = iota
|
|
Gopher
|
|
Zebra
|
|
)
|
|
|
|
func (a *Animal) UnmarshalXML(d *goxml.Decoder, start goxml.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 *goxml.Encoder, start goxml.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 := goxml.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
|
|
}
|