Go中处理文本格式

首先是xml

解析xml

package main

import (
	"encoding/xml"   //xml标准库
	"fmt"
	"io/ioutil"
	"os"
)

type Recurlyservers struct {
	XMLName     xml.Name `xml:"servers"`
	Version     string   `xml:"version,attr"`
	Svs         []server `xml:"server"`
	Description string   `xml:",innerxml"`
}

type server struct {
	XMLName    xml.Name `xml:"server"`
	ServerName string   `xml:"serverName"`
	ServerIP   string   `xml:"serverIP"`
}

func main() {
	file, err := os.Open("servers.xml") // 打开xml文件.		
	if err != nil {
		fmt.Printf("error: %v", err)
		return
	}
	defer file.Close()             //主程序返回时关闭文件
	data, err := ioutil.ReadAll(file)   //读取数据
	if err != nil {
		fmt.Printf("error: %v", err)
		return
	}
	v := Recurlyservers{}
	err = xml.Unmarshal(data, &v) //将xml解析成对应的结构体格式
	if err != nil {
		fmt.Printf("error: %v", err)
		return
	}

	fmt.Println(v)    //输出结构体
}

xml文件解析成对应的struct对象是通过xml.Unmarshal来完成的

func Unmarshal(data []byte, v interface{}) error

函数定义了两个参数,第一个是xml的数据流,第二个是存储的对应类型.支持struct,string,slice

输出xml

xml标准库中有两个函数能帮我们输出

func Marshal(v interface{}) ([]byte, error)
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)

第二个函数会增加前缀和缩进

 

package main

import (
	"encoding/xml"
	"fmt"
	"os"
)

type Servers struct {
	XMLName xml.Name `xml:"servers"`
	Version string   `xml:"version,attr"`
	Svs     []server `xml:"server"`
}

type server struct {
	ServerName string `xml:"serverName"`
	ServerIP   string `xml:"serverIP"`
}

func main() {
	v := &Servers{Version: "1"}     //创建结构体变量
	v.Svs = append(v.Svs, server{"Shanghai_VPN", "127.0.0.1"})  //添加进结构体中
	v.Svs = append(v.Svs, server{"Beijing_VPN", "127.0.0.2"})
	output, err := xml.MarshalIndent(v, "  ", "    ") //参数是interface{}类型,所以可以接受任意形式的参数
	if err != nil {
		fmt.Printf("error: %v\n", err)
	}
	os.Stdout.Write([]byte(xml.Header))//因为生成xml函数是不带xml头的,这里先写上去保证输出xml格式正确

	os.Stdout.Write(output)//写入文件中
}

JSON处理

可以通过这个函数解析json

func Unmarshal(data []byte, v interface{}) error

解析json

package main

import (
	"encoding/json"
	"fmt"
)

type Server struct {
	ServerName string
	ServerIP   string
}

type Serverslice struct {
	Servers []Server
}

func main() {
	var s Serverslice  //创建结构体变量
	str := `{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"127.0.0.2"}]}`
	//JSON格式str
	json.Unmarshal([]byte(str), &s)
	fmt.Println(s)
}

生成json的话有这个函数

func Marshal(v interface{}) ([]byte, error)
package main

import (
	"encoding/json"
	"fmt"
)

type Server struct {
	ServerName string
	ServerIP   string
}

type Serverslice struct {
	Servers []Server
}

func main() {
	var s Serverslice
	s.Servers = append(s.Servers, Server{ServerName: "Shanghai_VPN", ServerIP: "127.0.0.1"})
	s.Servers = append(s.Servers, Server{ServerName: "Beijing_VPN", ServerIP: "127.0.0.2"})
	b, err := json.Marshal(s)
	if err != nil {
		fmt.Println("json err:", err)
	}
	fmt.Println(string(b))
}

可以定义tag修改输出json字段

type Server struct {
	ServerName string `json:"serverName"`
	ServerIP   string `json:"serverIP"`
}

type Serverslice struct {
	Servers []Server `json:"servers"`
}

 

posted @ 2018-05-09 17:49  Esiarp  阅读(146)  评论(0)    收藏  举报