要读取的XML如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <resources>
- <string name="VideoLoading">Loading video…</string>
- <string name="ApplicationName">what</string>
- </resources>
这种结构的XML,其末节点是属性与文本并存的(网上看到的大部分教程都是属性节点就是属性节点,文本节点就是文本节点)
根据这个XML,生成对应的struct
- type StringResources struct {
- XMLName xml.Name `xml:"resources"`
- ResourceString []ResourceString `xml:"string"`
- }
- type ResourceString struct {
- XMLName xml.Name `xml:"string"`
- StringName string `xml:"name,attr"`
- InnerText string `xml:",innerxml"`
- }
(内部属性都要大写字母开头,属性节点的名称变量名固定为XMLName,内部的文本统一叫innerxml)
以下为完整读取此XML的代码
输出结果如图:
- package main
- import (
- "encoding/xml"
- "io/IoUtil"
- "log"
- )
- type StringResources struct {
- XMLName xml.Name `xml:"resources"`
- ResourceString []ResourceString `xml:"string"`
- }
- type ResourceString struct {
- XMLName xml.Name `xml:"string"`
- StringName string `xml:"name,innerxml"`
- }
- func main() {
- content,err := IoUtil.ReadFile("studygolang.xml")
- if err != nil {
- log.Fatal(err)
- }
- var result StringResources
- err = xml.Unmarshal(content,&result)
- if err != nil {
- log.Fatal(err)
- }
- log.Println(result)
- log.Println(result.ResourceString)
- for _,o := range result.ResourceString {
- log.Println(o.StringName + "===" + o.InnerText)
- }
- }
接下来对这个XMl中的属性值为ApplicationName的文本内容进行修改,然后保存到文件里,代码如下:
- package main
- import (
- "encoding/xml"
- "fmt"
- "io/IoUtil"
- "log"
- "os"
- "strings"
- )
- type StringResources struct {
- XMLName xml.Name `xml:"resources"`
- ResourceString []ResourceString `xml:"string"`
- }
- type ResourceString struct {
- XMLName xml.Name `xml:"string"`
- StringName string `xml:"name,&result)
- if err != nil {
- log.Fatal(err)
- }
- log.Println(result)
- log.Println(result.ResourceString)
- for i,line := range result.ResourceString {
- log.Println(line.StringName + "===" + line.InnerText)
- //修改ApplicationName节点的内部文本innerText
- if strings.EqualFold(line.StringName,"ApplicationName") {
- fmt.Println("change innerText")
- //注意修改的不是line对象,而是直接使用result中的真实对象
- result.ResourceString[i].InnerText = "这是新的ApplicationName"
- }
- }
- //保存修改后的内容
- xmlOutPut,outPutErr := xml.MarshalIndent(result,"","")
- if outPutErr == nil {
- //加入XML头
- headerBytes := []byte(xml.Header)
- //拼接XML头和实际XML内容
- xmlOutPutData := append(headerBytes,xmlOutPut...)
- //写入文件
- IoUtil.WriteFile("studygolang_test.xml",xmlOutPutData,os.ModeAppend)
- fmt.Println("OK~")
- } else {
- fmt.Println(outPutErr)
- }
- }
编译运行如图:
生成的XML如下:
更复杂的XML结构,这里就不多讲了。主要是struct的结构会复杂点。
- <?xml version="1.0" encoding="UTF-8"?>
- <resources>
- <string name="VideoLoading">Loading video…</string>
- <string name="ApplicationName">这是新的ApplicationName</string>
- </resources>