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

【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, " ", "  ")//打印XMLfmt.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 中的多个元素。

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

相关文章:

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

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;处理 XML 数据主要使用 encoding/xml 包。这个包提供了…...

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5 1. 安装 Oracle Database 23ai2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开…...

在 Ubuntu 上安装 `.deb` 软件包有几种方法

在 Ubuntu 上安装 .deb 软件包有几种方法&#xff0c;可以使用命令行工具&#xff0c;也可以通过图形界面进行安装。以下是几种常见的安装方法&#xff1a; 方法 1&#xff1a;使用 dpkg 命令安装 .deb 包 打开终端。 使用 dpkg 命令安装 .deb 包&#xff1a; sudo dpkg -i /…...

一文了解Android本地广播

在 Android 开发中&#xff0c;本地广播&#xff08;Local Broadcast&#xff09;是一种轻量级的通信机制&#xff0c;主要用于在同一应用进程内的不同组件之间传递消息&#xff0c;而无需通过系统的全局广播机制。这种方法既可以提高安全性&#xff08;因为广播仅在应用内传播…...

Ingress nginx 公开TCP服务

文章目录 背景搞起拓展( PROXY Protocol )参考 背景 公司业务繁多&#xff0c; HTTP、GRPC、TCP多种协议服务并存&#xff0c;Kubernetes流量入口复杂&#xff0c;所以萌生了通过LoadBalancer Ingress-nginx 的方式完全的结果入口流量&#xff0c;当然在高并发的场景下可以对…...

谷歌浏览器支持的开发者工具详解

谷歌浏览器&#xff08;Google Chrome&#xff09;是全球最受欢迎的网页浏览器之一&#xff0c;它不仅提供了快速、安全的浏览体验&#xff0c;还为开发者提供了强大的开发者工具。本文将详细介绍如何使用谷歌浏览器的开发者工具&#xff0c;并解答一些常见问题。&#xff08;本…...

【数据结构】汇编 、机器语言 高级语言 简析。

汇编语言、机器语言和高级语言 1. 机器语言&#xff08;Machine Language&#xff09; 定义&#xff1a;机器语言是计算机能够直接执行的、用二进制编码的指令集&#xff0c;属于最低级别的编程语言。它由 0 和 1 组成&#xff0c;每条指令由一串二进制数表示。机器语言与计算…...

【青牛科技】GC3901,强势替代 A3901/ALLEGRO应用于摇头机等产品中

在电子工程的浩瀚世界里&#xff0c;不断追求更优性能、更高效率和更低成本的芯片解决方案&#xff0c;是每一位电子工程师的不懈目标。今天&#xff0c;我们要为大家隆重介绍一款足以让你眼前一亮的芯片 —— 芯麦 GC3901&#xff0c;它将以强大的实力成为 A3901/ALLEGRO 的完…...

Java API类与接口:类的转换方法与正则表达式

文章目录 Java包装类的概述对应包装类包装类的转换方法&#xff08;parse)Integer.parseInt(String s)Long.parseLong(String s)Byte.parseByte(String s)Short.parseShort(String s)Float.parseFloat(String s)Double.parseDouble(String s) 正则表达式常用方法 字符规则. 匹配…...

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类&#xff0c;已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC&#xff0c;以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…...

Linux服务器定时执行jar重启命令

1. sh脚本编写 appNamecvcp-weather PIDps -ef |grep java | grep $appName | grep -v grep | awk {print $2} if [ "$PID" "" ]; thensleep 1;echo "no process";elseecho "process exsits";kill -9 $PID fi sleep 2s nohup /usr/l…...

速览!Win11 22H2/23H2 11月更新补丁KB5046633发布!

系统之家11月13日报道消息&#xff0c;微软为Win11 22H2和23H2用户发布了11月更新补丁KB5046633。此次更新后&#xff0c;系统版本号提升至22621.4460和22631.4460。该补丁包含多项改进和修复&#xff0c;有助于提升用户的使用体验感。想了解完整内容的小伙伴&#xff0c;请继续…...

A day a tweet(sixteen)——The better way of search of ChatGPT

Introducing ChatGPT search a/ad.及时的/及时地 ChatGPT can now search the web in a much better way than before so you get fast, timely a.有关的(relative n.亲戚,亲属;同类事物 a.比较的&#xff1b;相对的) answers with link…...

【网络】HTTP 协议

目录 基本概念基于 HTTP 的系统组成HTTP 的基本性质 HTTP 请求头 & 响应头HTTP 的请求方法HTTP 的返回码HTTP 的 CookieHTTP 缓存 Cache-Control会话HTTP/1.x 的连接管理 基本概念 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一…...

git push报错 unexpected disconnect while reading sideband packet

应该是缓冲不够引起的&#xff0c;可以使用以下命令增加缓存&#xff1a; git config --global http.postBuffer 1048576000 1048576000这里的单位是Byte, 也就是1G。 亲测可以了...

JSX 语法与基础组件使用

在 React Native 中&#xff0c;JSX 是一种 JavaScript 的语法扩展&#xff0c;用于描述 UI 界面。JSX 语法类似于 HTML&#xff0c;但它是 JavaScript 的语法糖&#xff0c;可以直接在 JavaScript 代码中编写 UI 组件。本章节将介绍 JSX 语法的基础知识&#xff0c;以及 React…...

ReactPress:构建高效、灵活、可扩展的开源发布平台

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。ReactPress&#xff0c;作为一款融合了现代Web开发多项先进技术的开…...

emulator总结

什么是硬件仿真器 做IC设计的人应该都知道软件仿真和FPGA原型验证&#xff0c;可以把硬件仿真器理解为这二者之间的产物&#xff0c;它同时具备二者的优点。 软件仿真&#xff08;simulator&#xff09;全面&#xff0c;支持UVM、assert、coverage收集、可以很方便的dump 波形…...

【Docker】‘docker‘ 不是内部或外部命令,也不是可运行的程序 或 批处理文件

在windows 电脑上安装了 Docker Desktop,在控制台输入 docker -v提示报错 ‘docker’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 报错原因是&#xff0c;环境变量没配置 解决办法&#xff0c;在系统环境变量中配置path &#xff0c;重新打开cmd 或者…...

Mysql高可用架构方案

Mysql 介绍 Mysql是典型的开源关系型数据库&#xff0c;是许多网站、应用程序、企业软件产品的首选数据库。 Mysql特性&#xff1a; 易于使用&#xff0c;功能强大&#xff0c;支持事务、触发器、存储过程 管理工具多种多样且功能丰富 可以作为千万级数据管理的大型数据库 采…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...