# 5.12、Golang标准库-xml
对xml解析
## 两个核心函数
```go
// struct 转 xml
func Marshal(v any) ([]byte, error) {}
// xml 转 struct
func Unmarshal(data []byte, v any) error {}
```
## 两个核心结构体
```go
// 从输入流读取并解析xml
type Decoder struct {}
// 将xml写入到输出流
type Encoder struct {}
```
序列化
```go
package main
import (
"encoding/xml"
"fmt"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
func main() {
person := Person{
Name: "Tom",
Age: 23,
Email: "123@qq.com",
}
b, _ := xml.Marshal(person)
fmt.Printf("b: %v\n", string(b))
// b: Tom23123@qq.com
// 带缩进格式
b2, _ := xml.MarshalIndent(person, " ", " ")
fmt.Printf("%v\n", string(b2))
//
// Tom
// 23
// 123@qq.com
//
}
```
反序列化
```go
package main
import (
"encoding/xml"
"fmt"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
func main() {
str := `
Tom
23
123@qq.com
`
b := []byte(str)
var person Person
xml.Unmarshal(b, &person)
fmt.Printf("person: %v\n", person)
// person: {{ person} Tom 23 123@qq.com}
}
```
## 读写xml文件
从文件读取
person.xml
```xml
Tom
23
123@qq.com
```
```go
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
func main() {
content, _ := os.ReadFile("person.xml")
b := []byte(content)
var person Person
xml.Unmarshal(b, &person)
fmt.Printf("person: %v\n", person)
// person: {{ person} Tom 23 123@qq.com}
}
```
写入到文件
```go
package main
import (
"encoding/xml"
"os"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
func main() {
person := Person{
Name: "Tom",
Age: 23,
Email: "123@qq.com",
}
f, _ := os.OpenFile("person.xml", os.O_WRONLY|os.O_CREATE, os.ModePerm)
defer f.Close()
encoder := xml.NewEncoder(f)
encoder.Encode(person)
}
```
输出结果 person.xml
```xml
Tom23123@qq.com
```