要读取的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,attr"` InnerText string `xml:",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,attr"` InnerText string `xml:",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 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 version="1.0" encoding="UTF-8"?> <resources> <string name="VideoLoading">Loading video…</string> <string name="ApplicationName">这是新的ApplicationName</string> </resources>
更复杂的XML结构,这里就不多讲了。主要是struct的结构会复杂点。