一.Go语言标准库提供的API

  • 在encoding/xml包下提供了对XML序列化和反序列化的API
  • 使用Unmarshal可以直接把XML字节切片数据转换为结构体
  • 转换时按照特定的转换规则进行转换,且数据类型可以自动转换
  1. * 如果结构体字段的类型为字符串或者[]byte,且标签为",innerxml"
  2. Unmarshal函数直接将对应原始XML文本写入该字段,其余规则仍适用。
  3. * 如果结构体字段类型为xml.Name且名为XMLNameUnmarshal会将元素名写入该字段
  4. * 如果字段XMLName的标签的格式为"name""namespace-URL name"
  5. XML元素必须有给定的名字(以及可选的名字空间),否则Unmarshal会返回错误。
  6. * 如果XML元素的属性的名字匹配某个标签",attr"为字段的字段名,或者匹配某个标签为"name,attr"
  7. 的字段的标签名,Unmarshal会将该属性的值写入该字段。
  8. * 如果XML元素包含字符数据,该数据会存入结构体中第一个具有标签",chardata"的字段中,
  9. 该字段可以是字符串类型或者[]byte类型。如果没有这样的字段,字符数据会丢弃。
  10. * 如果XML元素包含注释,该数据会存入结构体中第一个具有标签",comment"的字段中,
  11. 该字段可以是字符串类型或者[]byte类型。如果没有这样的字段,字符数据会丢弃。
  12. * 如果XML元素包含一个子元素,其名称匹配格式为"a""a>b>c"的标签的前缀,反序列化会深入
  13. XML结构中寻找具有指定名称的元素,并将最后端的元素映射到该标签所在的结构体字段。
  14. ">"开始的标签等价于以字段名开始并紧跟着">" 的标签。
  15. * 如果XML元素包含一个子元素,其名称匹配某个结构体类型字段的XMLName字段的标签名,
  16. 且该结构体字段本身没有显式指定标签名,Unmarshal会将该元素映射到该字段。
  17. * 如果XML元素的包含一个子元素,其名称匹配够格结构体字段的字段名,且该字段没有任何模式选项
  18. ",attr"",chardata"等),Unmarshal会将该元素映射到该字段。
  19. * 如果XML元素包含的某个子元素不匹配以上任一条,而存在某个字段其标签为",any"
  20. Unmarshal会将该元素映射到该字段。
  21. * 匿名字段被处理为其字段好像位于外层结构体中一样。
  22. * 标签为"-"的结构体字段永不会被反序列化填写。

二. XML文件读取

  • 给定XML文件内容如下
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <people id="888">
  3. <name>smallming</name>
  4. <address>北京海淀</address>
  5. </people>
  • 新建结构体,装载XML数据
    • 结构体中属性首字母必须大写,否则无法装配
  1. type People struct {
  2. XMLName xml.Name `xml:"people"`
  3. Id int `xml:"id,attr"`
  4. Name string `xml:"name"`
  5. Address string `xml:"address"`
  6. }
  7. func main() {
  8. peo := new(People)
  9. b, err := ioutil.ReadFile("demo.xml")
  10. fmt.Println(string(b))
  11. fmt.Println("111:", err)
  12. err = xml.Unmarshal(b, peo)
  13. fmt.Println("2222", err)
  14. fmt.Println(peo)
  15. }

三.多层嵌套XML文件读取

  • 给定XML中数据如下
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <peoples version="0.9">
  3. <people id="888">
  4. <name>smallming</name>
  5. <address>北京海淀</address>
  6. </people>
  7. <people id="998">
  8. <name>佳明哥</name>
  9. <address>北京朝阳</address>
  10. </people>
  11. </peoples>
  • 编写读取XML数据代码
  1. type Peoples struct {
  2. XMLName xml.Name `xml:"peoples"`
  3. Version string `xml:"version,attr"`
  4. Peos []People `xml:"people"`
  5. }
  6. type People struct {
  7. XMLName xml.Name `xml:"people"`
  8. Id int `xml:"id,attr"`
  9. Name string `xml:"name"`
  10. Address string `xml:"address"`
  11. }
  12. func main() {
  13. peo := new(Peoples)
  14. b, err := ioutil.ReadFile("demo.xml")
  15. fmt.Println(string(b))
  16. fmt.Println("111:", err)
  17. err = xml.Unmarshal(b, peo)
  18. fmt.Println("2222", err)
  19. fmt.Println(peo)
  20. }