2 回复
在Go语言中,可以使用encoding/xml包将XML字符串反序列化为结构体。以下是一个完整的示例:
package main
import (
"encoding/xml"
"fmt"
)
// 定义与XML对应的结构体
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
func main() {
// XML字符串
xmlData := `
<person>
<name>张三</name>
<age>30</age>
<email>zhangsan@example.com</email>
</person>
`
// 反序列化
var person Person
err := xml.Unmarshal([]byte(xmlData), &person)
if err != nil {
fmt.Printf("反序列化失败: %v\n", err)
return
}
// 输出结果
fmt.Printf("姓名: %s\n", person.Name)
fmt.Printf("年龄: %d\n", person.Age)
fmt.Printf("邮箱: %s\n", person.Email)
}
对于嵌套的XML结构:
package main
import (
"encoding/xml"
"fmt"
)
type Address struct {
City string `xml:"city"`
Country string `xml:"country"`
}
type Employee struct {
XMLName xml.Name `xml:"employee"`
ID int `xml:"id,attr"` // 属性
Name string `xml:"name"`
Dept string `xml:"department"`
Address Address `xml:"address"`
}
func main() {
xmlData := `
<employee id="1001">
<name>李四</name>
<department>技术部</department>
<address>
<city>北京</city>
<country>中国</country>
</address>
</employee>
`
var emp Employee
err := xml.Unmarshal([]byte(xmlData), &emp)
if err != nil {
fmt.Printf("反序列化失败: %v\n", err)
return
}
fmt.Printf("ID: %d\n", emp.ID)
fmt.Printf("姓名: %s\n", emp.Name)
fmt.Printf("部门: %s\n", emp.Dept)
fmt.Printf("城市: %s\n", emp.Address.City)
fmt.Printf("国家: %s\n", emp.Address.Country)
}
处理XML数组:
package main
import (
"encoding/xml"
"fmt"
)
type Users struct {
XMLName xml.Name `xml:"users"`
Users []User `xml:"user"`
}
type User struct {
XMLName xml.Name `xml:"user"`
ID string `xml:"id,attr"`
Name string `xml:"name"`
}
func main() {
xmlData := `
<users>
<user id="1">
<name>用户1</name>
</user>
<user id="2">
<name>用户2</name>
</user>
</users>
`
var users Users
err := xml.Unmarshal([]byte(xmlData), &users)
if err != nil {
fmt.Printf("反序列化失败: %v\n", err)
return
}
for _, user := range users.Users {
fmt.Printf("ID: %s, 姓名: %s\n", user.ID, user.Name)
}
}
使用xml.Unmarshal函数时需要注意:
- 结构体字段标签中的
xml标签指定了XML元素的对应关系 ,attr表示对应XML属性XMLName字段用于指定根元素名称- 结构体字段名首字母必须大写才能被导出


