Go语言关于XML的读取与生成

前端之家收集整理的这篇文章主要介绍了Go语言关于XML的读取与生成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

要读取的XML如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <resources>
  3. <string name="VideoLoading">Loading video…</string>
  4. <string name="ApplicationName">what</string>
  5. </resources>

这种结构的XML,其末节点是属性与文本并存的(网上看到的大部分教程都是属性节点就是属性节点,文本节点就是文本节点)

根据这个XML,生成对应的struct

  1. type StringResources struct {
  2. XMLName xml.Name `xml:"resources"`
  3. ResourceString []ResourceString `xml:"string"`
  4. }
  5.  
  6. type ResourceString struct {
  7. XMLName xml.Name `xml:"string"`
  8. StringName string `xml:"name,attr"`
  9. InnerText string `xml:",innerxml"`
  10. }

(内部属性都要大写字母开头,属性节点的名称变量名固定为XMLName,内部的文本统一叫innerxml)

以下为完整读取此XML的代码

  1. package main
  2.  
  3. import (
  4. "encoding/xml"
  5. "io/IoUtil"
  6. "log"
  7. )
  8.  
  9. type StringResources struct {
  10. XMLName xml.Name `xml:"resources"`
  11. ResourceString []ResourceString `xml:"string"`
  12. }
  13.  
  14. type ResourceString struct {
  15. XMLName xml.Name `xml:"string"`
  16. StringName string `xml:"name,innerxml"`
  17. }
  18.  
  19. func main() {
  20. content,err := IoUtil.ReadFile("studygolang.xml")
  21. if err != nil {
  22. log.Fatal(err)
  23. }
  24. var result StringResources
  25. err = xml.Unmarshal(content,&result)
  26. if err != nil {
  27. log.Fatal(err)
  28. }
  29. log.Println(result)
  30. log.Println(result.ResourceString)
  31. for _,o := range result.ResourceString {
  32. log.Println(o.StringName + "===" + o.InnerText)
  33. }
  34.  
  35. }
输出结果如图:

接下来对这个XMl中的属性值为ApplicationName的文本内容进行修改,然后保存到文件里,代码如下:

  1. package main
  2.  
  3. import (
  4. "encoding/xml"
  5. "fmt"
  6. "io/IoUtil"
  7. "log"
  8. "os"
  9. "strings"
  10. )
  11.  
  12. type StringResources struct {
  13. XMLName xml.Name `xml:"resources"`
  14. ResourceString []ResourceString `xml:"string"`
  15. }
  16.  
  17. type ResourceString struct {
  18. XMLName xml.Name `xml:"string"`
  19. StringName string `xml:"name,&result)
  20. if err != nil {
  21. log.Fatal(err)
  22. }
  23. log.Println(result)
  24. log.Println(result.ResourceString)
  25. for i,line := range result.ResourceString {
  26. log.Println(line.StringName + "===" + line.InnerText)
  27.  
  28. //修改ApplicationName节点的内部文本innerText
  29. if strings.EqualFold(line.StringName,"ApplicationName") {
  30. fmt.Println("change innerText")
  31.  
  32. //注意修改的不是line对象,而是直接使用result中的真实对象
  33. result.ResourceString[i].InnerText = "这是新的ApplicationName"
  34. }
  35. }
  36.  
  37. //保存修改后的内容
  38. xmlOutPut,outPutErr := xml.MarshalIndent(result,"","")
  39. if outPutErr == nil {
  40. //加入XML头
  41. headerBytes := []byte(xml.Header)
  42. //拼接XML头和实际XML内容
  43. xmlOutPutData := append(headerBytes,xmlOutPut...)
  44. //写入文件
  45. IoUtil.WriteFile("studygolang_test.xml",xmlOutPutData,os.ModeAppend)
  46.  
  47. fmt.Println("OK~")
  48. } else {
  49. fmt.Println(outPutErr)
  50. }
  51.  
  52. }

编译运行如图:


生成的XML如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <resources>
  3. <string name="VideoLoading">Loading video…</string>
  4. <string name="ApplicationName">这是新的ApplicationName</string>
  5. </resources>
更复杂的XML结构,这里就不多讲了。主要是struct的结构会复杂点。

猜你在找的XML相关文章