首页 > 后端开发 > Golang > 正文

如何使用Golang encoding/xml处理XML数据

P粉602998670
发布: 2025-10-08 12:03:02
原创
423人浏览过
Go语言encoding/xml包通过结构体标签实现XML编解码,支持解析与生成。需定义可导出字段的结构体,用xml标签映射元素和属性,如xml:"name"对应节点名,attr表示属性,chardata获取文本内容,可用xml.Unmarshal解析数据,xml.MarshalIndent生成格式化XML,结合XMLName、切片和嵌套结构处理复杂结构。

如何使用golang encoding/xml处理xml数据

Go语言的encoding/xml包提供了对XML数据的编解码支持,适合处理结构清晰的XML内容。使用它,你可以将XML解析为结构体,也可以将结构体序列化为XML字符串。整个过程依赖标签(struct tags)来映射字段。

定义结构体映射XML元素

要解析XML,先根据数据结构定义对应的Go结构体。通过xml标签控制字段与XML节点的对应关系。

注意:结构体字段必须是可导出的(即首字母大写),否则xml包无法访问。

示例XML:

<person>
  <name>Alice</name>
  <age>30</age>
  <city>Beijing</city>
</person>
登录后复制

对应的结构体:

立即学习go语言免费学习笔记(深入)”;

type Person struct {
    XMLName xml.Name `xml:"person"`
    Name    string   `xml:"name"`
    Age     int      `xml:"age"`
    City    string   `xml:"city"`
}
登录后复制

XMLName字段用于指定根元素名称,不是必需的,但有助于反序列化时匹配。

解析XML字符串或文件

使用xml.Unmarshal将XML数据解析到结构体中。

示例代码:

data := `
<person>
  <name>Alice</name>
  <age>30</age>
  <city>Beijing</city>
</person>`

var p Person
err := xml.Unmarshal([]byte(data), &p)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", p)
登录后复制

输出:

{XMLName:{Space: Local:person} Name:Alice Age:30 City:Beijing}
登录后复制

若从文件读取,可用ioutil.ReadFileos.Open配合xml.NewDecoder逐个解析。

使用xml.NewDecoder读取文件示例:

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 508
查看详情 动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
file, err := os.Open("person.xml")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

var p Person
decoder := xml.NewDecoder(file)
err = decoder.Decode(&p)
if err != nil {
    log.Fatal(err)
}
登录后复制

处理属性和嵌套结构

XML属性用attr标签标识,嵌套元素则通过嵌套结构体表示。

带属性的XML示例:

<person id="123" active="true">
  <contact type="email">alice@example.com</contact>
</person>
登录后复制

对应结构体:

type Person struct {
    XMLName xml.Name `xml:"person"`
    ID      string   `xml:"id,attr"`
    Active  bool     `xml:"active,attr"`
    Contact Contact  `xml:"contact"`
}

type Contact struct {
    Type  string `xml:"type,attr"`
    Value string `xml:",chardata"`
}
登录后复制

其中chardata表示该字段应填充XML元素的文本内容。

解析后,Contact.Value会得到alice@example.com

生成XML输出

使用xml.MarshalIndentxml.Marshal将结构体转换为XML。

示例:

p := Person{
    ID:     "123",
    Active: true,
    Contact: Contact{
        Type:  "email",
        Value: "alice@example.com",
    },
}

output, err := xml.MarshalIndent(p, "", "  ")
if err != nil {
    log.Fatal(err)
}
fmt.Println(xml.Header + string(output))
登录后复制

xml.Header通常为<?xml version="1.0" encoding="UTF-8"?>,可手动添加。

输出:

<?xml version="1.0" encoding="UTF-8"?>
<person id="123" active="true">
  <contact type="email">alice@example.com</contact>
</person>
登录后复制
常见技巧:
  • 忽略字段:使用xml:"-"
  • 处理命名空间:在标签中写xml:"ns uri person"
  • 切片处理重复元素:xml:"item"自动匹配多个同名节点
  • 使用interface{}xml.Token处理不规则结构
基本上就这些。熟练掌握结构体标签和数据类型映射,就能高效处理大多数XML场景。

以上就是如何使用Golang encoding/xml处理XML数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号