「笔记」「GO语言」XML文件的读写操作

package main

import (
    "database/sql"
    "encoding/xml"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "io/ioutil"
    "os"
)

type Conf struct {
    XMLName     xml.Name       `xml:"Configuration"`
    Version     string         `xml:"Version,attr"`
    Database    DatabaseConfig `xml:"Database"`
    Description string         `xml:",innerxml"`
}

type DatabaseConfig struct {
    XMLName   xml.Name `xml:"Database"`
    DBtype    string   `xml:"DBtype"`
    DBhost    string   `xml:"DBhost"`
    DBport    string   `xml:"DBport"`
    DBname    string   `xml:"DBname"`
    Protocol  string   `xml:"Protocol"`
    DBuser    string   `xml:"DBuser"`
    DBpwd     string   `xml:"DBpwd"`
    DBcharset string   `xml:"DBcharset"`
    Testsql   string   `xml:"Testsql"`
}

func checkDBerr(err error) {
    if err != nil {
        fmt.Println("DBerror:", err)
    }
}

func checkIOerr(err error) {
    if err != nil {
        fmt.Println("IOerror:", err)
    }
}

func main() {
    //判断配置文件是否存在,如果不存在则提示用户输入配置并创建文件,如果存在则直接读取
    configFile, err := os.Open("src/conf.xml")
    defer configFile.Close()
    if err != nil {
        if false == os.IsExist(err) {
            config := Conf{}
            fmt.Println("Config file not exists,please input the config:")
            fmt.Println("Input the database type:")
            fmt.Scanf("%s", &config.Database.DBtype)

            if "mysql" == config.Database.DBtype {
                fmt.Println("The database type is:", config.Database.DBtype)
                fmt.Println("Input the database host:")
                fmt.Scanf("%s", &config.Database.DBhost)
                fmt.Println("Input the database port:")
                fmt.Scanf("%s", &config.Database.DBport)
                fmt.Println("Input the database name:")
                fmt.Scanf("%s", &config.Database.DBname)
                fmt.Println("Input the network protocol:")
                fmt.Scanf("%s", &config.Database.Protocol)
                fmt.Println("Input the database user:")
                fmt.Scanf("%s", &config.Database.DBuser)
                fmt.Println("Input the database password:")
                fmt.Scanf("%s", &config.Database.DBpwd)
                fmt.Println("Input the database character set:")
                fmt.Scanf("%s", &config.Database.DBcharset)
                config.Database.Testsql = "select welcomeinfo from welcomeinfo"
                config.Version="0.0.0"

                dbConnStr := config.Database.DBuser + ":" +
                    config.Database.DBpwd + "@" +
                    config.Database.Protocol + "(" +
                    config.Database.DBhost + ":" +
                    config.Database.DBport + ")/" +
                    config.Database.DBname + "?charset=" +
                    config.Database.DBcharset

                fmt.Println("Database type is:", config.Database.DBtype)
                fmt.Println("Database connection string is:", dbConnStr)
                fmt.Println("Datebase test SQL:", config.Database.Testsql)
                fmt.Println("Testing the connection of database...")
                db, err := sql.Open("mysql", dbConnStr)
                defer db.Close()
                checkDBerr(err)
                rows, err := db.Query(config.Database.Testsql)
                checkDBerr(err)
                if rows.Next() {
                    var welcomeinfo string
                    rows.Scan(&welcomeinfo)
                    fmt.Println("Connect to database succeeded:", welcomeinfo)
                    fmt.Println("Generating config file...")
                    outXML,err:=xml.MarshalIndent(config," ","  ")
                    checkIOerr(err)
                    //os.Stdout.Write(outXML)
                    configFile,err:=os.Create("src/conf.xml")
                    defer configFile.Close()
                    checkIOerr(err)
                    configFile.Write(outXML)
                    fmt.Println("Config file generated!")
                } else {
                    fmt.Println("TestSQL failed!")
                }
            } else {
                fmt.Println("Sorry,database type not supported:", config.Database.DBtype)
            }
        } else {
            checkIOerr(err)
        }
    } else {
        //如果配置文件存在则直接读取配置并连接到数据库
        fmt.Println("Loading config file...")
        data, err := ioutil.ReadAll(configFile)
        checkIOerr(err)
        config := Conf{}
        err = xml.Unmarshal(data, &config)
        checkIOerr(err)

        if "mysql" == config.Database.DBtype {
            dbConnStr := config.Database.DBuser + ":" +
                config.Database.DBpwd + "@" +
                config.Database.Protocol + "(" +
                config.Database.DBhost + ":" +
                config.Database.DBport + ")/" +
                config.Database.DBname + "?charset=" +
                config.Database.DBcharset
            fmt.Println("Database type is:", config.Database.DBtype)
            fmt.Println("Database connection string is:", dbConnStr)
            fmt.Println("Datebase test SQL:", config.Database.Testsql)
            fmt.Println("Testing the connection of database...")
            db, err := sql.Open("mysql", dbConnStr)
            defer db.Close()
            checkDBerr(err)
            rows, err := db.Query(config.Database.Testsql)
            checkDBerr(err)
            if rows.Next() {
                var welcomeinfo string
                rows.Scan(&welcomeinfo)
                fmt.Println("Connect to database succeeded:", welcomeinfo)
            } else {
                fmt.Println("TestSQL failed!")
            }

        } else {
            fmt.Println("Sorry,database type not supported:", config.Database.DBtype)
        }
        fmt.Println("Finish loading config file.")
    }
}