Golang XML解析:如何同时提取元素值与属性
Go encoding/xml 同时提取元素属性与文本值的解决方案
解析如下XML时,需要同时提取<b>元素的k属性值和标签内的文本内容,但使用encoding/xml包时,之前的结构体定义只能单独获取属性或文本:
<item version="2"> <m compressor="snappy" seekable="N"> <b k="block_sentinel">2vFJNBXc6Sk8EoeYeRBIuQ==</b> <b k="tail_sentinel">v6E/qStZR/CXKBVmVT2q4w==</b> </m> </item>
解决方案
要同时获取属性和文本,只需在<b>对应的结构体中添加一个带有xml:",chardata"标签的字段,用来捕获元素的文本内容,同时保留属性字段。
修改后的结构体定义及完整测试代码如下:
package main import ( "encoding/xml" "fmt" "log" ) var sample = []byte(` <item version="2"> <m compressor="snappy" seekable="N"> <b k="block_sentinel">2vFJNBXc6Sk8EoeYeRBIuQ==</b> <b k="tail_sentinel">v6E/qStZR/CXKBVmVT2q4w==</b> </m> </item> `) type exml struct { XMLName xml.Name `xml:"item"` Version xml.Attr `xml:"version,attr,omitempty"` M struct { XMLName xml.Name `xml:"m"` Compressor xml.Attr `xml:"compressor,attr,omitempty"` Seekable xml.Attr `xml:"seekable,attr,omitempty"` B []struct { XMLName xml.Name `xml:"b"` K xml.Attr `xml:"k,attr,omitempty"` Value string `xml:",chardata"` // 捕获文本内容的字段 } `xml:"b"` } `xml:"m"` } func main() { var x exml if err := xml.Unmarshal(sample, &x); err != nil { log.Panicf("xml > %v :: err > %s", x, err) } // 直接打印结构体 fmt.Printf("%v\n", x) // 更清晰的遍历输出 fmt.Println("\n详细内容:") for _, b := range x.M.B { fmt.Printf("k: %s, 值: %s\n", b.K.Value, b.Value) } }
说明
xml:",chardata"标签专门用于匹配元素的文本内容,与属性字段共存时,encoding/xml会同时解析属性和文本到对应的结构体字段中。- 之前的
exml1结构体缺少捕获文本的字段,exml2直接将<b>映射为字符串类型,只能获取文本而忽略属性,修改后的结构体则兼顾了两者的解析需求。
内容的提问来源于stack exchange,提问作者hektorsuhr
相关产品推荐
相关产品推荐

