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

如何将XML子数组直接解析为Go结构体数组?

Go XML解析:直接访问嵌套数组元素的解决办法

问题场景

现有如下XML结构:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<directory count="2">
<entries>
    <entry name="Alice"/>
    <entry name="Bob"/>
</entries>
</directory>

期望解析为Go结构体后,直接通过Directory.Entries[i]访问条目,但最初的写法中Directory.Entries始终为空:

type Entry struct {
    XMLName xml.Name `xml:"entry"`
    Name    string   `xml:"name,attr"`
}

type Directory struct {
    XMLName xml.Name `xml:"directory"`
    Count   string   `xml:"count,attr"`
    Entries []Entry  `xml:"entries"`
}

使用代理结构体虽能正常解析,但需要通过Directory.Entries.Entry[i]访问,不够直观。

解决办法

无需自定义编解码器,只需调整Directory结构体中Entries字段的XML标签,使用路径选择器指定直接解析entries节点下的entry子元素:

修改后的完整结构体定义:

import "encoding/xml"

type Entry struct {
    XMLName xml.Name `xml:"entry"`
    Name    string   `xml:"name,attr"`
}

type Directory struct {
    XMLName xml.Name `xml:"directory"`
    Count   string   `xml:"count,attr"`
    // 使用 "entries>entry" 直接定位到entries下的entry元素
    Entries []Entry  `xml:"entries>entry"`
}

验证示例

以下是完整的解析测试代码:

package main

import (
    "encoding/xml"
    "fmt"
)

type Entry struct {
    XMLName xml.Name `xml:"entry"`
    Name    string   `xml:"name,attr"`
}

type Directory struct {
    XMLName xml.Name `xml:"directory"`
    Count   string   `xml:"count,attr"`
    Entries []Entry  `xml:"entries>entry"`
}

func main() {
    xmlData := `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<directory count="2">
<entries>
    <entry name="Alice"/>
    <entry name="Bob"/>
</entries>
</directory>`

    var dir Directory
    err := xml.Unmarshal([]byte(xmlData), &dir)
    if err != nil {
        fmt.Printf("解析错误: %v\n", err)
        return
    }

    fmt.Printf("目录计数: %s\n", dir.Count)
    for i, entry := range dir.Entries {
        fmt.Printf("条目%d: %s\n", i+1, entry.Name)
    }
}

运行后输出:

目录计数: 2
条目1: Alice
条目2: Bob

这样就可以直接通过Directory.Entries[i]访问每个条目,无需额外的代理结构体。

内容的提问来源于stack exchange,提问作者Rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:11:13