xml 包实现 xml 解析
核心的两个函数
将 struct 转成 xml ,可以接受任意类型
func Marshal(v interface{}) ([]byte, error)
将 xml 转成 struct
func Unmarshal(data []byte, v interface{}) error
两个核心结构体
从输出流读取解析 xml
type Decoder struct {
...
}
写 xml 到输入流
type Encoder struct {
}
实例演示
结构体转xml
func Marshal() {
p := Person{
Name: "tom",
Age: 20,
Email: "tom@gmail.com",
}
// b, _ := xml.Marshal(Person)
// MarshalIndent可以对齐
b, _ := xml.MarshalIndent(p, " ", " ")
fmt.Printf("%v\n", string(b))
}
/*
<person>
<name>tom</name>
<age>20</age>
<email>tom@gmail.com</email>
</person>
*/
xml转结构体
func Unmarshal() {
s := `
<person>
<name>tom</name>
<age>20</age>
<email>tom@gmail.com</email>
</person>
`
b := []byte(s)
var per Person
xml.Unmarshal(b, &per)
fmt.Printf("per: %v\n", per) // per: {{ person} tom 20 tom@gmail.com}
}
读写文件
a.xml
<person>
<name>tom</name>
<age>20</age>
<email>tom@gmail.com</email>
</person>
读 xml 文件
func read() {
b, _ := ioutil.ReadFile("a.xml")
var p Person
xml.Unmarshal(b, &p)
fmt.Printf("p: %v\n", p) // p: {{ person} tom 20 tom@gmail.com}
}
写 xml 文件
func write() {
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
p := Person{
Name: "tom",
Age: 20,
Email: "tom@gmail.com",
}
f, _ := os.OpenFile("a.xml", os.O_WRONLY|os.O_CREATE, 0777)
defer f.Close()
e := xml.NewEncoder(f)
// 覆盖对应的位置 后面的不覆盖
e.Encode(p)
}
b.xml
<person><name>tom</name><age>20</age><email>tom@gmail.com</email></person>