首页 > 编程 > Golang > 正文

Go学习笔记:xml库的使用

2020-04-01 19:11:41
字体:
来源:转载
供稿:网友
Go学习笔记:xml库的使用

  1. package main 
  2.  
  3. import ( 
  4.     "os" 
  5.     "io" 
  6.     "fmt" 
  7.     "encoding/xml" 
  8.     "strconv" 
  9.  
  10. type Config map[string]map[string]string 
  11.  
  12. var config = make(Config) 
  13.  
  14. type Class struct { 
  15.     XMLName xml.Name  `xml:"class"`      //xml元素名称 
  16.     Id      int       `xml:"id,attr"`    // 
  17.     Pers    []Persion `xml:"persion"`    // 
  18.     Desc    string    `xml:",innerxml"`  // 
  19.  
  20. type Persion struct { 
  21.     XMLName  xml.Name `xml:"persion"
  22.     Id       int      `xml:"id,attr"
  23.     Name     string   `xml:"name"
  24.     Age      int      `xml:"age"
  25.  
  26. func (self *Config)LoadXmlFile(filename, node string) error{ 
  27.     fd, err := os.Open(filename) 
  28.     if err != nil{ 
  29.         return err  
  30.     }    
  31.     defer fd.Close() 
  32.     return self.Load(fd, node) 
  33. func (self *Config)Load(r io.Reader, node string) error { 
  34.     mynode := false 
  35.     if _, ok := (*self)[node]; !ok { 
  36.         (*self)[node] = make(map[string]string) 
  37.     }    
  38.     decoder := xml.NewDecoder(r) 
  39.     for { 
  40.         token, err := decoder.Token() 
  41.         if err != nil { 
  42.             if err.Error() == "EOF" { 
  43.                 break 
  44.             } 
  45.             return err 
  46.         } 
  47.         switch value := token.(type) { 
  48.             case xml.StartElement: 
  49.                 switch { 
  50.                     case value.Name.Local == node: 
  51.                         mynode = true 
  52.                     case mynode == true
  53.                         tb, err := decoder.Token() 
  54.                         if err != nil { 
  55.                             continue 
  56.                         } 
  57.                         switch tv := tb.(type) { 
  58.                             case xml.CharData: 
  59.                                 (*self)[node][value.Name.Local] = string(tv) 
  60.                         } 
  61.                 } 
  62.             case xml.EndElement: 
  63.                 if value.Name.Local == node{ 
  64.                     mynode = false 
  65.                 } 
  66.         } 
  67.     } 
  68.     return nil 
  69.  
  70.  
  71. func main(){ 
  72.     var ps = make([]Persion, 0) 
  73.     for i := 0; i < 5; i++ { 
  74.         var tp Persion 
  75.         tp.Id = i 
  76.         tp.Name = "persion" + strconv.Itoa(i) 
  77.         tp.Age = 20 + i 
  78.         ps = append(ps,tp) 
  79.     } 
  80.     var c = Class{Id:1, Pers: ps} 
  81.     var res, _ = xml.MarshalIndent(c, """    "
  82.     fmt.Println(c) 
  83.     fmt.Println(string(res)) 
  84.     config.LoadXmlFile("config.xml""global"
  85.     fmt.Println(config) 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表