Go语言关于XML的读取与生成
发布时间:2020-12-16 09:15:04 所属栏目:百科 来源:网络整理
导读:要读取的XML如下: ?xml version="1.0" encoding="UTF-8"?resourcesstring name="VideoLoading"Loading video…/stringstring name="ApplicationName"what/string/resources 这种结构的XML,其末节点是属性与文本并存的(网上看到的大部分教程都是属性节点就
要读取的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 version="1.0" encoding="UTF-8"?> <resources> <string name="VideoLoading">Loading video…</string> <string name="ApplicationName">这是新的ApplicationName</string> </resources>更复杂的XML结构,这里就不多讲了。主要是struct的结构会复杂点。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |