当前位置: 首页 > article >正文

【go从零单排】XML序列化和反序列化

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 语言中,处理 XML 数据主要使用 encoding/xml 包。这个包提供了序列化(编码)和反序列化(解码)XML 数据的功能。

💻代码

package main

//导入 encoding/xml 包用于处理 XML 数据,导入 fmt 包用于格式化输出。
import (
	"encoding/xml"
	"fmt"
)

// Plant 结构体用于表示植物信息。
// XMLName 字段用于指定 XML 的根元素名称为 plant。
// Id 字段表示植物的 ID,使用 XML 属性 id。
// Name 字段表示植物的名称。
// Origin 字段是一个字符串切片,表示植物的原产地。
type Plant struct {
	XMLName xml.Name `xml:"plant"` //注意首字母要大写
	Id      int      `xml:"id,attr"`
	Name    string   `xml:"name"`
	Origin  []string `xml:"origin"`
}

// 为 Plant 结构体定义了一个 String 方法,方便打印植物的详细信息。
func (p Plant) String() string {
	return fmt.Sprintf("Plant id=%v, name=%v, origin=%v",
		p.Id, p.Name, p.Origin)
}

func main() {
	//创建一个 Plant 实例 coffee,ID 为 27,名称为 "Coffee",并设置原产地为 "Ethiopia" 和 "Brazil"。
	coffee := &Plant{Id: 27, Name: "Coffee"}
	coffee.Origin = []string{"Ethiopia", "Brazil"}
	//使用 xml.MarshalIndent 将 coffee 对象编码为格式化的 XML 字符串,并将结果存储在 out 中。
	//MarshalIndent 函数的第二个和第三个参数用于指定缩进格式。
	out, _ := xml.MarshalIndent(coffee, " ", "  ")
	//打印XML
	fmt.Println(string(out))
	//在输出中添加 XML 头部(<?xml version="1.0" encoding="UTF-8"?>),并打印完整的 XML。
	fmt.Println(xml.Header + string(out))
	//创建一个空的 Plant 变量 p。
	var p Plant
	//使用 xml.Unmarshal 将之前生成的 XML 字符串解码到 p 中。
	if err := xml.Unmarshal(out, &p); err != nil {
		//如果解码失败,则触发 panic。
		panic(err)
	}
	//打印解码后的 Plant 对象。
	fmt.Println(p)
	//创建另一个 Plant 实例 tomato,ID 为 81,名称为 "Tomato",原产地为 "Mexico" 和 "California"。
	tomato := &Plant{Id: 81, Name: "Tomato"}
	tomato.Origin = []string{"Mexico", "California"}
	//定义了一个 Nesting 结构体,用于表示一个包含多个植物的集合。
	type Nesting struct { //这是一个嵌套结构体
		//XMLName 字段指定根元素名称为 nesting。
		XMLName xml.Name `xml:"nesting"`
		//Plants 字段是一个指向 Plant 结构体切片的指针,表示嵌套的植物元素。
		Plants []*Plant `xml:"parent>child>plant"`
	}
	//创建一个 Nesting 实例
	nesting := &Nesting{}
	//将 coffee 和 tomato 添加到 Plants 切片中。
	nesting.Plants = []*Plant{coffee, tomato}
	//xml.MarshalIndent 将 nesting 对象编码为格式化的 XML 字符串,并打印结果。
	out, _ = xml.MarshalIndent(nesting, " ", "  ")
	fmt.Println(string(out))
}

//输出
//<plant id="27">
//   <name>Coffee</name>
//   <origin>Ethiopia</origin>
//   <origin>Brazil</origin>
// </plant>
//<?xml version="1.0" encoding="UTF-8"?>
// <plant id="27">
//   <name>Coffee</name>
//   <origin>Ethiopia</origin>
//   <origin>Brazil</origin>
// </plant>
//Plant id=27, name=Coffee, origin=[Ethiopia Brazil]
// <nesting>
//   <parent>
//     <child>
//       <plant id="27">
//         <name>Coffee</name>
//         <origin>Ethiopia</origin>
//         <origin>Brazil</origin>
//       </plant>
//       <plant id="81">
//         <name>Tomato</name>
//         <origin>Mexico</origin>
//         <origin>California</origin>
//       </plant>
//     </child>
//   </parent>
// </nesting>

🔍理解

基本概念

  • 结构体标签:
    通过结构体标签定义 XML 元素和属性的名称。
    使用 xml 标签来指定 XML 的元素名和属性。
  • 编码(Marshal):
    将 Go 结构体转换为 XML 格式的字符串。xml.MarshalIndent(coffee, “”, " ")
  • 解码(Unmarshal):
    将 XML 格式的字符串转换为 Go 结构体。xml.Unmarshal(out, &p)

💡 Tips

注意事项

  • 错误处理:在编码和解码过程中,务必检查错误,以确保数据处理的正确性。
  • 嵌套结构体:可以定义嵌套的结构体,以表示更复杂的 XML 结构。
  • 数组和切片:可以使用切片来表示 XML 中的多个元素。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.kler.cn/a/391181.html

相关文章:

  • 华为机试HJ39 判断两个IP是否属于同一子网
  • 矢量拟合(1)Sanathanan–Koerner算法
  • 深度学习代码笔记
  • AI 扩展开发者思维方式:以 SQL 查询优化为例
  • centos7上安装mysql
  • AI绘画经验(stable-diffusion)
  • 高校大数据人工智能教学沙盘分享
  • Nginx 的 proxy_pass 使用简介
  • DriveLM 论文学习
  • 前端Cypress自动化测试全网详解
  • 如何快速解决Windows系统中的emp.dll问题
  • Vue中优雅的使用Echarts的三种方式
  • Kubernetes的基本构建块和最小可调度单元pod-0
  • 单例模式全面解析
  • API架构解说
  • Linux(CentOS)项目总结(前后端分离)
  • js | 作用域
  • Day43 | 动态规划 :状态机DP 买卖股票的最佳时机买卖股票的最佳时机II
  • 020_Servlet_Mysql学生选课系统(新版)_lwplus87
  • 第 3 章 -GO语言 基本语法
  • 1Panel修改PostgreSQL时区
  • 高版本安装JAVA JDK没有JRE环境的解决办法
  • 恒创科技:什么是 RAID 3 ? RAID 3、4 和5之间有什么区别?
  • excel使用
  • 实习冲刺Day19
  • 【小程序】封装网络请求request模块