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

windvix · · 14384 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

要读取的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的结构会复杂点。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:windvix

查看原文:Go语言关于XML的读取与生成

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

14384 次点击  
加入收藏 微博
3 回复  |  直到 2017-12-07 11:11:17
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传