为什么要搞这个玩意。我准备做一个golang的留言板。也不打算自己用框架去写了。准备自己设计一版出来,读取的话我这边只是单单的做读取mysql 配置信息用的
下面看我的 xml 格式 以及对应的解析代码
test.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Db>
<db_host>127.0.0.1</db_host>
<db_name>bbs</db_name>
<db_user>root</db_user>
<db_pass>123456</db_pass>
</Db>
test.go
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)
type Conf struct {
Db `xml:"Db"`
}
type Db struct {
Db_host string `xml:"db_host"`
Db_name string `xml:"db_name"`
Db_user string `xml:"db_user"`
Db_pass string `xml:"db_pass"`
}
func main() {
file_data, err := file_open("test.xml")
if err != nil {
fmt.Println(err.Error())
os.Exit(0)
}
tpl := Conf{}
//根据传递的构造体解析 切记 第二个参数传递的是指针
tpl_err := xml.Unmarshal(file_data, &tpl)
if tpl_err != nil {
fmt.Println("tpl err :", tpl_err)
os.Exit(0)
}
fmt.Println(tpl)
}
func file_open(file_name string) ([]byte, error) {
//定义变量
var (
open *os.File
file_data []byte
open_err, read_err error
)
//打开文件
open, open_err = os.Open(file_name)
if open_err != nil {
return nil, open_err
}
//关闭资源
defer open.Close()
//读取所有文件内容
file_data, read_err = ioutil.ReadAll(open)
if read_err != nil {
return nil, read_err
}
return file_data, nil
}
切记 如果使用 struct xml 格式 第一层必须 与构造体名称相同
比如下面的代码
type Conf struct {
Host string `xml:"server_host"` //运行域名
Port int64 `xml:"server_port"` //运行端口
AppName string `xml:"app_name"` //项目名称
RunMode string `xml:"run_mode"` //运行模块
TplPATH string `xml:"tpl_path"` //模板路径
TplExt string `xml:"tpl_ext"` //模板后缀
Db confDB
}
错误的格式 如果不带对应的 构造体为第一层 他不会报错也不会解析数据到对应的构造体
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<server_host>127.0.0.1</server_host>
<server_port>8080</server_port>
<tpl_ext>html</tpl_ext>
正确的格式
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Conf>
<server_host>127.0.0.1</server_host>
<server_port>8080</server_port>
<tpl_ext>html</tpl_ext>
</Conf>