Go使用xml.Unmarshal解析单标签XML无法获取值该如何解决
问题原因
你原有的结构体定义逻辑不符合XML的结构匹配规则:你给Boolean字段标注的xml:"boolean"标签,含义是在当前结构体对应的XML根节点下,查找名为boolean的子节点,将子节点内容赋值给该字段。但你提供的XML中根节点本身就是boolean,不存在对应的子节点,自然匹配不到内容,只能拿到类型的默认零值。
解决方案
场景1:解析无命名空间的简化XML
方法1:结构体显式匹配根节点结构
引入标准库的xml.Name字段指定结构体对应的根元素名,用,chardata标签标识该字段取元素内部的文本内容:
import "encoding/xml" type Authenticate struct { XMLName xml.Name `xml:"boolean"` Boolean bool `xml:",chardata"` }
调用xml.Unmarshal时传入*Authenticate类型的指针即可完成解析。
方法2:直接解析到基础类型变量
因为是单标签无嵌套的简单结构,不需要额外定义结构体,直接传入对应类型的指针即可解析:
var res bool err := xml.Unmarshal([]byte(`<boolean>true</boolean>`), &res) // 解析完成后res的值为true
场景2:解析带命名空间的原始XML
需要在标签中补充命名空间声明,标签格式为xml:"命名空间 元素名":
type Authenticate struct { XMLName xml.Name `xml:"http://foo.com.BARRSD/ boolean"` Boolean bool `xml:",chardata"` }
如果使用直接解析到基础类型的方案,不需要做额外适配,xml.Unmarshal会自动匹配根节点内容完成解析。
内容的提问来源于stack exchange,提问作者ShawnC
相关产品推荐
相关产品推荐

