Go语言通过encoding/xml库支持XML解析与生成。1. 定义结构体并用xml.Unmarshal解析XML数据,如Person结构体映射name、age、city字段;2. 使用xml:"attr"处理属性,嵌套结构体处理子元素,如id、active属性及contact信息;3. 对于动态XML,可用xml.Decoder流式读取节点,适合大文件或结构不确定场景;4. 用xml.MarshalIndent将结构体序列化为格式化XML字符串,仅导出字段生效。掌握结构体标签、属性与文本映射(如,chardata和,attr)是关键。

Go语言通过标准库encoding/xml提供了对XML数据的解析和生成支持。它既可以处理简单的键值结构,也能映射复杂的嵌套XML文档。下面介绍如何使用该库进行常见操作。
1. 解析XML字符串或文件
要解析XML数据,首先定义一个与XML结构对应的Go结构体,并使用xml.Unmarshal将数据填充到结构体中。
示例XML内容:
对应的结构体和解析代码:
立即学习“go语言免费学习笔记(深入)”;
type Person struct {Name string `xml:"name"`
Age int `xml:"age"`
City string `xml:"city"`
}
data := `
var p Person
err := xml.Unmarshal([]byte(data), &p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", p) // 输出:{Name:Alice Age:30 City:Beijing}
2. 处理属性和嵌套结构
XML中常包含属性(attributes)和嵌套元素。可以通过在struct tag中使用attr和子结构体来映射。
示例带属性的XML:
ail>alice@example.com
对应结构体:
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速
ID string `xml:"id,attr"`
Active bool `xml:"active,attr"`
Contact Contact `xml:"contact"`
}
type Contact struct {
Email string `xml:"email"`
Phone struct {
Type string `xml:"type,attr"`
Num string `xml:",chardata"`
} `xml:"phone"`
}
解析后可正确提取属性和文本内容。
3. 解析未知或动态XML
当XML结构不固定时,可以使用map[string]interface{}方式解析不太方便,但encoding/xml支持逐节点读取。
使用xml.Decoder按流式解析,适合大文件或结构不确定的情况。
dec := xml.NewDecoder(reader)
for {
tok, err := dec.Token()
if err == io.EOF { break }
if err != nil { log.Fatal(err) }
switch se := tok.(type) {
case xml.StartElement:
fmt.Println("Start:", se.Name.Local)
case xml.CharData:
fmt.Println("Text:", string(se))
case xml.EndElement:
fmt.Println("End:", se.Name.Local)
}
}
4. 生成XML数据
使用xml.MarshalIndent或xml.Marshal可将结构体转为XML字符串。
if err != nil { log.Fatal(err) }
fmt.Println(string(output))
注意:导出字段(首字母大写)才会被序列化。可添加xml:"tagname"控制输出标签名。
基本上就这些。掌握结构体映射、属性处理和流式解析,就能应对大多数XML场景。不复杂但容易忽略细节,比如,chardata和,attr的写法。多试几次就熟练了。









