Go语言解析Xml,当标签内有属性并且有文本值时应该这样定义结构体

前言

       对不起大家哈,我已经很久没有写博客记录了,并不是没时间呀,主要是下班了就想好好休息…

回归正题

一、问题描述

使用go语言解析xml结构时,我需要定义一个结构体用来装,这时我遇到一个傻眼的xml复杂结构,如下


 <Device id="d1" name="Mazak" uuid="M7011L016ZN">
      <Description manufacturer="Mazak Corporation" serialNumber="M7011L016ZN">Mill w/SMART</Description>
 </Device>

这里可以看到Xml内的 Description 节点,它不仅拥有文本值 “Mill w/SMART” 还有属性(manufacturer、serialNumber) 这个时候我就不知道怎么定义结构体了。没解决之前,我的结构体是如下定义的:

type MTConnectDevicesDevice struct {
	XMLName xml.Name `xml:"Device"`    //当前标签名称
	Id      string   `xml:"id,attr"`   //当前标签名称的属性id
	Name    string   `xml:"name,attr"` //当前标签名称的属性name
	Uuid    string   `xml:"uuid,attr"` //当前标签名称的属性uuid
	Description MTConnectDevicesDescription `xml:"Description"` //当前子标签名称Description
}

type MTConnectDevicesDescription struct {
	XMLName      xml.Name `xml:"Description"`         //当前标签名称
	Manufacturer string   `xml:"manufacturer,attr"`   //当前标签名称的属性 manufacturer 
	SerialNumber string   `xml:"serialNumber,attr"`   //当前标签名称的属性 serialNumber
}

这个使用 xml.Unmarshal() 解析之后,结构体“MTConnectDevicesDescription” 它只能获取 Xml内 Description 节点的属性(manufacturer、serialNumber) 它们的值,并没有获取到他的文本值“Mill w/SMART”

二、解决问题

按以上定义的结构体当然是获取不到的,这里呢其实并不难,只是我刚使用Go 语言来操作Xml,有很多函数和语法都不太熟悉。
来吧,其实只要再定义一个结构体的属性来接收这个文本值就好了 (XMLValue string xml:",innerxml" )


type MTConnectDevicesDescription struct {
	XMLName      xml.Name `xml:"Description"`         //当前标签名称
	XMLValue     string   `xml:",innerxml"`           //取当前节点的文本值
	Manufacturer string   `xml:"manufacturer,attr"`   //当前标签名称的属性 manufacturer 
	SerialNumber string   `xml:"serialNumber,attr"`   //当前标签名称的属性 serialNumber
}

就是 XMLValue 来接收当前节点的文本值。记得加这一句==>xml:",innerxml"

三、致谢

enmm…这里说一下哈,前面有博客留下联系方式,我给重新编辑删除了,因为我消息爆炸了哈哈哈,不好意思,如果找我有事呢,可以私信我,有时间我一定回复的哈。谢谢大家,我撤了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值