腾讯微群加入QQ群

 找回密码
 加入我们

!connect_header_login!

!connect_header_login_tip!

搜索
查看: 979|回复: 0

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

[复制链接]
发表于 2016-8-22 18:32:03 | 显示全部楼层 |阅读模式

要读取的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.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

转自:http://blog.csdn.net/windvix/article/details/44237799?locationNum=6
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|手机版|Archiver|小黑屋|一起疯|苦咖啡 ( 新ICP备12000197号  

GMT+8, 2018-7-21 00:42 , Processed in 0.044237 second(s), 11 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表