package main
import (
"os"
"io"
"fmt"
"encoding/xml"
"strconv"
)
type Config map[string]map[string]string
var config = make(Config)
type Class struct {
XMLName xml.Name `xml:"class"` //xml元素名称
Id int `xml:"id,attr"` //
Pers []Persion `xml:"persion"` //
Desc string `xml:",innerxml"` //
}
type Persion struct {
XMLName xml.Name `xml:"persion"`
Id int `xml:"id,attr"`
Name string `xml:"name"`
Age int `xml:"age"`
}
func (self *Config)LoadXmlFile(filename, node string) error{
fd, err := os.Open(filename)
if err != nil{
return err
}
defer fd.Close()
return self.Load(fd, node)
}
func (self *Config)Load(r io.Reader, node string) error {
mynode := false
if _, ok := (*self)[node]; !ok {
(*self)[node] = make(map[string]string)
}
decoder := xml.NewDecoder(r)
for {
token, err := decoder.Token()
if err != nil {
if err.Error() == "EOF" {
break
}
return err
}
switch value := token.(type) {
case xml.StartElement:
switch {
case value.Name.Local == node:
mynode = true
case mynode == true:
tb, err := decoder.Token()
if err != nil {
continue
}
switch tv := tb.(type) {
case xml.CharData:
(*self)[node][value.Name.Local] = string(tv)
}
}
case xml.EndElement:
if value.Name.Local == node{
mynode = false
}
}
}
return nil
}
func main(){
var ps = make([]Persion, 0)
for i := 0; i < 5; i++ {
var tp Persion
tp.Id = i
tp.Name = "persion" + strconv.Itoa(i)
tp.Age = 20 + i
ps = append(ps,tp)
}
var c = Class{Id:1, Pers: ps}
var res, _ = xml.MarshalIndent(c, "", " ")
fmt.Println(c)
fmt.Println(string(res))
config.LoadXmlFile("config.xml", "global")
fmt.Println(config)
}