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

Golang解析法国油价开放XML文件字段全为空问题求助

问题原因

  • Go语言中encoding/xml包需要通过反射给结构体字段赋值,首字母小写的字段属于私有字段,外部包无法访问,所以只能匹配到节点的数量,所有字段都无法被赋值
  • Pdv结构体中ville字段的标签配置错误,ville是独立的子元素,不需要附加,chardata标记

修复后的代码

package main

import (
	"encoding/xml"
	"fmt"
	"io"
	"os"

	"golang.org/x/text/encoding/charmap"
)

type Prix struct {
	XMLName xml.Name `xml:"prix"`
	Id      string   `xml:"id,attr"`
	Nom     string   `xml:"nom,attr"`
	Maj     string   `xml:"maj,attr"`
	Valeur  string   `xml:"valeur,attr"`
}

type Adresse struct {
	XMLName xml.Name `xml:"adresse"`
	Value   string   `xml:",chardata"`
}

type Pdv struct {
	XMLName   xml.Name `xml:"pdv"`
	Id        string   `xml:"id,attr"`
	Latitude  string   `xml:"latitude,attr"`
	Longitude string   `xml:"longitude,attr"`
	Cp        string   `xml:"cp,attr"`
	Pop       string   `xml:"pop,attr"`
	Adresse   Adresse  `xml:"adresse"`
	Ville     string   `xml:"ville"`
	Prix      []Prix   `xml:"prix"`
}

type Pdv_liste struct {
	XMLName xml.Name `xml:"pdv_liste"`
	PDVs    []Pdv    `xml:"pdv"`
}

func makeCharsetReader(charset string, input io.Reader) (io.Reader, error) {
	if charset == "ISO-8859-1" {
		// Windows-1252是ISO-8859-1的超集,可兼容解析
		return charmap.Windows1252.NewDecoder().Reader(input), nil
	}
	return nil, fmt.Errorf("未知字符集: %s", charset)
}

func main() {
	xmlFile, err := os.Open("prix.xml")
	if err != nil {
		fmt.Println(err)
	}
	defer xmlFile.Close()

	var pdv_liste Pdv_liste
	decoder := xml.NewDecoder(xmlFile)
	decoder.CharsetReader = makeCharsetReader
	err = decoder.Decode(&pdv_liste)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println("加油站数量:", len(pdv_liste.PDVs))
	fmt.Println(pdv_liste.PDVs[0])
	fmt.Println("加油站邮编: ", pdv_liste.PDVs[0].Cp)
}

修改后运行即可正常输出所有解析到的字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:36:03