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

来源:互联网 发布:德州仪器校园招聘知乎 编辑:程序博客网 时间:2024/06/07 04:00

要读取的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 mainimport ("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 StringResourceserr = 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 mainimport ("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 StringResourceserr = 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节点的内部文本innerTextif 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的结构会复杂点。

0 0
原创粉丝点击