You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:07:13