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

前端之家收集整理的这篇文章主要介绍了Go语言关于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的结构会复杂点。

猜你在找的XML相关文章