共计 2458 个字符,预计需要花费 7 分钟才能阅读完成。
在开发中会常遇到 xml 数据序列化和反序列化,这里咱们介绍 go 语言解决 xml 数据。
encoding/xml 包实现了一个简略的 xml 1.0 解析器,能够了解 xml 名称空间。
读取 xml
示例:
package main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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
- 目录
正文完