当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
# go语言
# app
# 标准库
# xml
# 字符串
# 结构体
# 循环
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改
如何高效识别并拦截拼接式恶意域名 spam
c++输入输出流 c++ cin与cout格式化输出【方法】
Win10怎样安装Word样式库_Win10安装Word样式教程【步骤】
如何使用正则表达式提取以编号开头、后接多个注解的逻辑分组块
如何解决Windows字体显示模糊的问题?(ClearType设置)
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
Python 模块的 __name__ 属性如何由导入方式决定?
c++ std::atomic如何保证原子性 c++ CAS操作原理【底层】
如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值
C#如何使用Channel C#通道实现异步通信
Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】
Python与OpenAI接口集成实战_生成式AI应用场景解析
c++怎么用jemalloc c++替换默认内存分配器【性能】
c++ nullptr与NULL区别_c++11空指针规范
Win11怎么更改电脑密码_Windows 11修改本地账户密码【步骤】
如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法
如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】
PHP主流架构怎么处理表单验证_规则与自定义【技巧】
Windows电脑如何进入安全模式?(多种按键方法)
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
php删除数据怎么软删除_添加is_del字段标记删除【技巧】
Mac如何开启夜览模式_Mac护眼模式设置与定时
PythonGIL机制理解_多线程限制解析【教程】
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】
Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】
微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】
VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】
c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】
Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
Win11如何关闭小娜Cortana Win11禁用Cortana语音助手【优化】
Windows服务无法启动错误1067是什么_进程意外终止的解决方法
c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】
短链接怎么用php还原_从基础原理到代码实现教学【详解】
如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践
Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】
Mac如何调整Dock栏大小和位置_Mac程序坞个性化设置
使用类变量定义字符串常量时的类型安全最佳实践
ACF 教程:如何正确更新嵌套在多层 Group 字段内的子字段
VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】
如何在 Go 中判断变量是否为函数类型
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Python函数参数高级用法_默认值与可变参数解析【教程】
Win11 explorer.exe频繁崩溃_修复Win11资源管理器无限重启【步骤】
C#如何序列化对象为XML XmlSerializer用法
如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理
Win11怎么激活Windows10_Win11激活Win10系统方法【步骤】
MAC怎么截图并快速编辑_MAC自带截图快捷键与标注工具使用【方法】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。