go操作xml
在 Go 语言中处理 XML 时,保存(序列化)XML 数据通常使用标准库的 encoding/xml 包,而 xml.Name 是用于表示 XML 元素名称(包含命名空间)的结构体类型。下面分别详细说明:
一、XML 数据的保存(序列化)
将 Go 结构体序列化为 XML 字符串或写入文件,主要通过 xml.Marshal 或 xml.MarshalIndent 函数实现(后者会格式化输出,更易读)。
基本步骤:
- 定义结构体,并通过 xml标签指定 XML 元素/属性的映射规则(如元素名、属性、嵌套关系等)。
- 使用 xml.Marshal或xml.MarshalIndent将结构体转换为 XML 字节流。
- 将字节流写入文件或转换为字符串。
示例代码:
package mainimport ("encoding/xml""fmt""os"
)// 定义结构体,映射 XML 结构
type Person struct {XMLName xml.Name `xml:"person"` // 指定根元素名为 "person"Name    string   `xml:"name"`   // 子元素 <name>Age     int      `xml:"age"`    // 子元素 <age>Email   string   `xml:"email,attr"` // 作为属性 email
}func main() {// 创建结构体实例p := Person{Name:  "Alice",Age:   30,Email: "alice@example.com",}// 序列化(带缩进,更易读)data, err := xml.MarshalIndent(p, "", "  ")if err != nil {fmt.Printf("序列化失败:%v\n", err)return}// 转换为字符串并打印xmlStr := string(data)fmt.Println("XML 内容:")fmt.Println(xmlStr)// 保存到文件err = os.WriteFile("person.xml", data, 0644)if err != nil {fmt.Printf("保存文件失败:%v\n", err)return}fmt.Println("已保存到 person.xml")
}
输出结果(person.xml 内容):
<person email="alice@example.com"><name>Alice</name><age>30</age>
</person>
- xml.Marshal生成紧凑的 XML 字符串,- xml.MarshalIndent(p, "", " ")第二个参数是前缀,第三个参数是缩进符(这里用两个空格)。
- 结构体标签 xml:"xxx"用于指定 XML 元素名,xml:"xxx,attr"表示作为属性。
二、xml.Name 类型及赋值
xml.Name 是 encoding/xml 包中定义的结构体,用于表示 XML 元素的本地名称(Local)和命名空间(Space),定义如下:
type Name struct {Space string // 命名空间 URILocal string // 本地名称(元素名)
}
- Space:可选,用于指定 XML 元素的命名空间(如- http://example.com/ns)。
- Local:必填,指定 XML 元素的本地名称(即标签名,如- person、- name)。
如何赋值 xml.Name?
xml.Name 可以直接通过结构体字段初始化,或在序列化时通过标签指定。
1. 直接初始化赋值
// 方式1:直接初始化
name1 := xml.Name{Space: "http://example.com/ns",Local: "user",
}// 方式2:在结构体中初始化
type User struct {XMLName xml.Name `xml:"user"` // 标签指定(等价于 Local: "user",Space 为空)
}u := User{XMLName: xml.Name{Space: "http://example.com/ns", Local: "user"},
}
2. 通过 XML 标签指定(常用)
在结构体中,通常通过 xml:"Space Local" 标签为 XMLName 字段赋值,格式为:
- xml:"Local":仅指定本地名称(Space 为空)。
- xml:"Space Local":同时指定命名空间和本地名称(Space 和 Local 用空格分隔)。
示例:
type Book struct {XMLName xml.Name `xml:"http://example.com/books book"` // Space: 命名空间,Local: "book"Title   string   `xml:"title"`
}// 序列化后,根元素会包含命名空间
b := Book{Title: "Go 编程"}
data, _ := xml.MarshalIndent(b, "", "  ")
fmt.Println(string(data))
输出结果:
<book xmlns="http://example.com/books"><title>Go 编程</title>
</book>
- 命名空间会被自动添加为 xmlns属性(如果是根元素)。
- 子元素若继承命名空间,无需重复指定。
总结
- XML 保存:使用 xml.Marshal或xml.MarshalIndent序列化结构体,再写入文件或处理字符串。
- xml.Name类型:包含- Space(命名空间)和- Local(元素名)两个字段,用于定义 XML 元素的名称和命名空间。
- 赋值方式:可直接初始化结构体,或通过 xml:"Space Local"标签指定(推荐,更简洁)。
