在开发中会常遇到xml数据序列化和反序列化,这里咱们介绍go语言解决xml数据。
encoding/xml 包实现了一个简略的xml 1.0解析器,能够了解xml名称空间。
读取xml
示例:
package mainimport ( "encoding/xml" "fmt")type Note struct { XMLName xml.Name `xml:"note"` To string `xml:"to"` From string `xml:"from"` Heading string `xml:"heading"` Body string `xml:"body"` Files FilesArr `xml:"files"`}type FilesArr struct { Flag string `xml:"flag,attr"` // 读取flag属性 User []string `xml:"user"` // 读取user数组}func main() { //读取xml文件到缓存中,返回[]byte //xmlDoc, err := ioutil.ReadFile("test.xml") //if err != nil { // fmt.Println("xml文件读取失败!") // return //} //fmt.Println(string(xmlDoc)) xmlDoc := `<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tony</to> <from>jack</from> <heading>title</heading> <body>love you</body> <files flag="true"> <user>zhang</user> <user>li</user> </files> </note>` note := Note{} err := xml.Unmarshal([]byte(xmlDoc), ¬e) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(note) }}
读取递归数据xml
package mainimport ( "encoding/xml" "fmt")type ListItem struct { Name string `xml:"name"` List []ListItem `xml:"list"`}func main() { //读取xml文件到缓存中,返回[]byte //xmlDoc, err := ioutil.ReadFile("test.xml") //if err != nil { // fmt.Println("xml文件读取失败!") // return //} //fmt.Println(string(xmlDoc)) xmlDoc := `<?xml version="1.0" encoding="UTF-8"?> <list> <name>zhang</name> <list> <name>li</name> </list> </list>` list := ListItem{} err := xml.Unmarshal([]byte(xmlDoc), &list) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(list) }}
写入xml
示例:
package mainimport ( "encoding/xml" "fmt" "io/ioutil")type Note struct { XMLName xml.Name `xml:"note"` To string `xml:"to"` From string `xml:"from"` Heading string `xml:"heading"` Body string `xml:"body"` Files FilesArr `xml:"files"`}type FilesArr struct { Flag string `xml:"flag,attr"` // 读取flag属性 User []string `xml:"user"` // 读取user数组}func main() { user:=[]string{"zhang","li"} files:=FilesArr{Flag: "true",User: user} note:=Note{ To: "tony", From: "jack", Heading: "title", Body: "love you", Files:files, } xmlContent,err:=xml.Marshal(note) if err!=nil{ fmt.Println(err) } fmt.Println(string(xmlContent)) //写入demo.xml err=ioutil.WriteFile("demo.xml", xmlContent, 0666) if err!=nil{ fmt.Println(err) }}
写入递归数据
package mainimport ( "encoding/xml" "fmt" "io/ioutil")type ListItem struct { XMLName xml.Name `xml:"list"` Name string `xml:"name"` List []ListItem `xml:"list"`}func main() { list:=ListItem{Name: "li",List: nil} lists:=ListItem{Name: "zhang"} l := make([]ListItem,0) lists.List=append(l,list) xmlContent,err:=xml.Marshal(lists) if err!=nil{ fmt.Println(err) } fmt.Println(string(xmlContent)) //写入demo.xml err=ioutil.WriteFile("demo.xml", xmlContent, 0666) if err!=nil{ fmt.Println(err) }}
links
https://studygolang.com/pkgdoc
- 目录