前言
对不起大家哈,我已经很久没有写博客记录了,并不是没时间呀,主要是下班了就想好好休息…
回归正题
一、问题描述
使用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 stringxml:",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…这里说一下哈,前面有博客留下联系方式,我给重新编辑删除了,因为我消息爆炸了哈哈哈,不好意思,如果找我有事呢,可以私信我,有时间我一定回复的哈。谢谢大家,我撤了。