这是我参与「第五届青训营 」笔记创作活动的第5天
使用Golang实现XML文件与数据库间的转换-数据库到XML文件
实现功能
- 通过Golang编程实现对“通讯录”的XML 文档的解析,并把解析结果存到数据库的表中。
- 进一步实现相反的过程,即将数据库表的内容读出来,并将其转化为XML 文件存储起来
目的
- 通过实践去熟悉Gorm的使用
- 这次使用的XML文件格式很简单,主要是为了熟悉Gorm的增删改查
- 数据库的导出文件后面也会放在项目文件下
具体实现过程
准备工作
-
数据库建表
-
安装Gorm并连接数据库
在项目打开终端安装Gorm
go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite安装成功后的go.mod文件
-
连接数据库
dsn := "root:2515426141@tcp(127.0.0.1:3306)/xml?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("数据库连接失败") } -
建立与xml文件及数据库表相对应的结构体
xml对应的结构体
type Contacts struct { C []Contact `xml:"contact"` } type Contact struct { Name string `xml:"name"` Sex string `xml:"sex,attr"` Phone string `xml:"phone"` }数据库表对应的结构体
type ContactsModel struct { //定义与数据库字段相对应的结构体 gorm.Model Name string Sex string Phone string } func (*ContactsModel) TableName() string { return "go_xml" }这里使用的gorm.Model是gorm库提供的,放在这里其实没有必要,可以直接改为主键ID
这里与数据库对应的结构体实现了TableName接口,如果不实现该接口,gorm会默认使用该结构体的蛇形复数(contact_models)做为表名。
在这两个结构体中,字段名的首字母一定要大写,否则可能会导致写入数据失败(因为在Golang中首字母小写表示这个属性只能在同一个包中能被看见)
将数据从数据库到XML文件
-
将所有数据利用gorm读到一个slice中
func FromDB(db *gorm.DB) []ContactsModel { contacts := make([]ContactsModel, 0) db.Find(&contacts) fmt.Println(contacts) return contacts } -
使用range迭代数据,将每个数据中需要的字段存储到Contact的slice中最后全部放到一个Contacts中
func ToXMLModel(contacts []ContactsModel) Contacts { c := make([]Contact, 0, len(contacts)) for _, v := range contacts { temp := Contact{ Name: v.Name, Sex: v.Sex, Phone: v.Phone, } c = append(c, temp) } //fmt.Println(c) return Contacts{ c, } } -
序列化,存储到文件中
func ToXML(c *Contacts) error { //data, err := xml.Marshal(c) //fmt.Println(c) data, err := xml.MarshalIndent(c, "", " ") if err != nil { return err } ioutil.WriteFile("./realize/output.xml", data, 0644) return nil } -
相对于原版的使用Java的dom4j转换,不需要自己一个个去建立节点,只需要定义好对应的结构体就可以直接序列化存储到XML文件中