0

0

Go语言怎么自定义XML元素的解析和编码

煙雲

煙雲

发布时间:2025-12-17 11:46:02

|

332人浏览过

|

来源于php中文网

原创

Go语言XML处理核心是struct标签与xml.Unmarshaler/Marshaler接口:标签控制字段映射、属性、忽略、innerxml等;接口实现定制解析/编码逻辑,需主动调用Token方法。

go语言怎么自定义xml元素的解析和编码

Go语言通过encoding/xml包提供XML解析与编码能力,自定义行为主要靠结构体标签(struct tags)和实现特定接口(如xml.Unmarshalerxml.Marshaler)来完成。核心在于控制字段映射、跳过字段、重命名元素、处理嵌套或特殊格式内容。

用struct标签精细控制字段映射

结构体字段通过xml:标签声明如何参与XML序列化/反序列化,常用选项包括:

  • 字段名重命名xml:"book"让字段在XML中以出现,而非默认的驼峰转小写加连字符
  • 忽略字段xml:"-"完全跳过该字段;xml:",omitempty"仅在值为空(零值)时省略该元素或属性
  • 作为XML属性xml:"id,attr"将字段编码为同级元素的属性,如
  • 捕获原始XML内容xml:",innerxml"把子元素的全部未解析内容存入字符串字段(适合混合内容或需手动处理的片段)
  • 指定为字符数据(CDATA):暂无原生标签支持,但可通过自定义MarshalXML实现

实现xml.Unmarshaler来自定义解析逻辑

当默认解析无法满足需求(如解析带单位的数字150,或兼容多种格式),可让结构体实现UnmarshalXML(d *xml.Decoder, start xml.StartElement) error方法。

例如,解析一个带单位的尺寸字段:

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

type Size struct {
    Value float64 `xml:"-"`
    Unit  string  `xml:"unit,attr"`
}

func (s *Size) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    // 先读取属性
    for _, attr := range start.Attr {
        if attr.Name.Local == "unit" {
            s.Unit = attr.Value
        }
    }
    // 再读取文本内容
    token, err := d.Token()
    if err != nil {
        return err
    }
    if se, ok := token.(xml.CharData); ok {
        s.Value, _ = strconv.ParseFloat(strings.TrimSpace(string(se)), 64)
    }
    return nil
}

实现xml.Marshaler来自定义编码逻辑

类似地,实现MarshalXML(e *xml.Encoder, start xml.StartElement) error可完全控制输出格式。比如强制输出为CDATA、添加命名空间、或按业务规则生成嵌套结构。

来福FM
来福FM

来福 - 你的私人AI电台

下载

示例:将字符串字段始终包裹在中:

func (s MyContent) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    e.EncodeToken(start)
    e.EncodeToken(xml.CharData([]byte(``)))
    e.EncodeToken(xml.EndElement{Name: start.Name})
    return nil
}

处理嵌套、多态或动态结构

对于不确定子元素类型(如......),可先用通用结构体解析type字段,再根据值选择具体结构体二次解析;或使用xml:",any"捕获未知子元素为[]byte,再手动解码。

若需统一处理多个相似类型,可定义接口+工厂函数,避免重复判断逻辑。

基本上就这些。关键是先用好struct标签覆盖80%场景,复杂逻辑再上接口实现——不复杂但容易忽略的是:自定义方法里必须主动调用Decoder.Token()Encoder.EncodeToken()完成实际读写,否则会卡住或遗漏内容。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1874

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

986

2024.11.28

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6083

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

801

2023.09.14

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

6

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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