Go语言中正确反序列化多个同级XML元素为结构体切片的方法
技术百科
花韻仙語
发布时间:2026-01-01
浏览: 次 当xml字符串包含多个
同级根元素(如多个 `
在Go中,标准库的 encoding/xml.Unmarshal 函数要求输入XML必须有唯一根节点(well-formed XML document)。而问题中的XML片段实际是多个同级
正确的解决方案是使用 xml.Decoder,它支持流式解析,可对同一输入缓冲区连续调用 Decode,每次读取并解析一个独立的XML元素:
d := xml.NewDecoder(bytes.NewBufferString(xmlFragment))
var results []HostSystemIdentificationInfo
for {
var item struct {
IdentiferValue string `xml:"identifierValue"`
IdentiferType struct {
Label string `xml:"label"`
Summary string `xml:"summary"`
Key string `xml:"key"`
} `xml:"identifierType"`
}
err := d.Decode(&item)
if err == io.EOF {
break // 所有元素已读完
}
if err != nil {
log.Printf("XML decode error: %v", err)
continue // 跳过错误项,避免中断整个流程
}
results = append(results, HostSystemIdentificationInfo{item})
}⚠️ 注意事项:不要复用切片变量地址:如原代码中 var t HostSystemIdentificationInfo 并传入 &t,因 HostSystemIdentificationInfo 是切片类型别名,Decode(&t) 实际尝试将整个XML结构解码为一个切片元素(而非追加),行为不可控。推荐改为解码为单个匿名结构体,再手动 append 到目标切片。命名一致性:结构体字段标签中 IdentiferValue / IdentiferType 拼写应为 IdentifierValue / IdentifierType(原文本含笔误),否则可能因大小写或拼写不匹配导致字段为空。xsi:type 属性处理:示例XML含 xsi:type 属性,若需保留或校验类型信息,可在结构体中添加对应字段:XSIType stringxml:"xsi:type,attr``。健壮性增强:生产环境建议添加 strings.TrimSpace 预处理XML片段,并用 xml.CharData 处理文本节点空白,避免 identifierValue 前导空格干扰。
综上,核心原则是:非标准XML片段 → 用 xml.Decoder 流式解析;标准单根XML → 用 xml.Unmarshal。合理选择解析方式,才能可靠处理vSphere等系统返回的类XML片段数据。
# go语言
# app
# go
# 循环
# 标准库
# xml
# 字符串
# 结构体
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11摄像头无法使用怎么办_Win11相机隐私
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Dapper的Execute方法的返回值是什么意思
- Python数据挖掘核心算法实践_聚类分类与特征工
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- Win10怎么限制单程序CPU占用上限_Win10
- Mac如何解压zip和rar文件?(推荐免费工具)
- c++怎么设置线程优先级与cpu亲和性_c++ 多
- PHP主流架构如何处理会话管理_Session与C
- Win11怎么查看局域网电脑_Windows 11
- Python对象比较与排序_魔术方法解析【教程】
- 如何使用Golang log记录不同级别日志_Go
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- c++中如何进行二进制文件读写_c++ read与
- 如何在 Go 中可靠地测试含 time.Time
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- Python 模块的 __name__ 属性如何由
- 如何使用Golang开发简单的聊天室消息存储_Go
- 如何在 Laravel 中通过嵌套关联关系进行 o
- php中常量能用::访问吗_类常量与作用域操作符使
- Python异步编程高级项目教程_asyncio协
- 使用类变量定义字符串常量时的类型安全最佳实践
- Mac的访达(Finder)怎么用_Mac文件管理
- Python装饰器复用技巧_通用能力解析【教程】
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Python网络日志追踪_请求定位解析【教程】
- Win11怎么设置默认浏览器Chrome_Wind
- PHP cURL GET请求:正确设置认证与自定义
- Win11怎么恢复误删照片_Win11数据恢复工具
- Golang如何避免指针逃逸_Golang逃逸分析
- PHP主流架构如何做单元测试_工具与流程【详解】
- PHP 中如何在函数内持久化修改引用变量的指向
- Win11怎么打开注册表_Windows 11注册
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11怎么用设置清理回收站_Win11设置清理
- Win11怎么关闭OneDrive同步_Win11
- c++中如何求一个数的平方根_c++ sqrt函数
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- Windows10如何更改桌面背景_Win10个性
- 如何在Golang中处理二进制数据_Golang
- Windows11怎么用“记事本”自动换行与编码
- Windows怎样拦截QQ浏览器广告_Window
- Windows10如何更改盘符名称_Win10重命
- LINUX怎么进行文本内容搜索_Linux gre
- Mac版Final Cut Pro入门_Mac视频
- php会话怎么开启_session_start函数
- php控制舵机角度怎么调_php发送pwm信号控制
- Windows服务持续崩溃怎样修复_系统服务保护机
- c++ namespace命名空间用法_c++避免
- c++怎么调用nana库开发GUI_c++ 现代风

QQ客服