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

