如何将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
相关产品推荐
相关产品推荐

