Go解析XML转JSON遇错误:期望<tracks>却得<track>,如何解决?
Go解析XML转JSON报错:
expected element type <tracks> but have <track> 解决方法 问题描述
我编写了一个Go工具,想要读取XML文件并转换为JSON格式,但运行时出现错误:2009/11/10 23:00:00 expected element type <tracks> but have <track>。
XML示例
<?xml version="1.0" encoding="utf-8"?> <tracks clid="020"> <track uuid="551" category="s" route="8" vehicle_type="trolleybus" > <point latitude="53.61491" longitude="55.90922" avg_speed="24" direction="270" time="13122022:072116" /> </track> <track uuid="552" category="s" route="6" vehicle_type="trolleybus"> <point latitude="53.68321" longitude="57.90922" avg_speed="42" direction="181" time="13122022:072216" /> </track> </tracks>
我的Go代码
package main import ( "encoding/json" "encoding/xml" "fmt" ) type Tracks struct { XMLName xml.Name `xml:"tracks" json:"-"` Clid string `xml:"clid,attr" json:"clid"` Tracks []Track `xml:"track" json:"track_list"` } type Track struct { XMLName xml.Name `xml:"tracks"` Uuid string `xml:"uuid,attr" json:"uuid"` Category string `xml:"category,attr" json:"category"` Route string `xml:"route,attr" json:"route"` VehicleType string `xml:"vehicle_type,attr" json:"vehicle_type"` Point Point `xml:"point" json:"point"` } type Point struct { Latitude string `xml:"latitude,attr" json:"latitude"` Longitude string `xml:"longitude,attr" json:"longitude"` AvgSpeed string `xml:"avg_speed,attr" json:"avg_speed"` Direction string `xml:"direction,attr" json:"direction"` Time string `xml:"time,attr" json:"time"` } func main() { rawXmlData := ` <?xml version="1.0" encoding="utf-8"?> <tracks clid="020"> <track uuid="551" category="s" route="8" vehicle_type="trolleybus"> <point latitude="53.61491" longitude="55.90922" avg_speed="24" direction="270" time="13122022:072116"/> </track> <track uuid="552" category="s" route="6" vehicle_type="trolleybus"> <point latitude="53.68321" longitude="57.90922" avg_speed="42" direction="181" time="13122022:072216"/> </track> </tracks> ` var tracks Tracks err := xml.Unmarshal([]byte(rawXmlData), &tracks) if err != nil { log.Fatal(err) } jsonData, err := json.Marshal(tracks) if err != nil { log.Fatal(err) } fmt.Printf(string(jsonData)) }
错误原因
- 核心问题:
Track结构体的XMLName标签配置错误,你写的是xml:"tracks",但该结构体对应的XML元素是<track>,XML解析器在读取<track>节点时,期望匹配<tracks>元素,因此抛出类型不匹配的错误。 - 次要问题:
main函数中使用了log.Fatal但未导入log包,编译时会触发额外报错。
解决方法
- 将
Track结构体的XMLName标签改为xml:"track",让它正确对应XML中的<track>节点。 - 在导入包中添加
"log"。
修正后的完整代码
package main import ( "encoding/json" "encoding/xml" "fmt" "log" ) type Tracks struct { XMLName xml.Name `xml:"tracks" json:"-"` Clid string `xml:"clid,attr" json:"clid"` Tracks []Track `xml:"track" json:"track_list"` } type Track struct { XMLName xml.Name `xml:"track"` Uuid string `xml:"uuid,attr" json:"uuid"` Category string `xml:"category,attr" json:"category"` Route string `xml:"route,attr" json:"route"` VehicleType string `xml:"vehicle_type,attr" json:"vehicle_type"` Point Point `xml:"point" json:"point"` } type Point struct { Latitude string `xml:"latitude,attr" json:"latitude"` Longitude string `xml:"longitude,attr" json:"longitude"` AvgSpeed string `xml:"avg_speed,attr" json:"avg_speed"` Direction string `xml:"direction,attr" json:"direction"` Time string `xml:"time,attr" json:"time"` } func main() { rawXmlData := ` <?xml version="1.0" encoding="utf-8"?> <tracks clid="020"> <track uuid="551" category="s" route="8" vehicle_type="trolleybus"> <point latitude="53.61491" longitude="55.90922" avg_speed="24" direction="270" time="13122022:072116"/> </track> <track uuid="552" category="s" route="6" vehicle_type="trolleybus"> <point latitude="53.68321" longitude="57.90922" avg_speed="42" direction="181" time="13122022:072216"/> </track> </tracks> ` var tracks Tracks err := xml.Unmarshal([]byte(rawXmlData), &tracks) if err != nil { log.Fatal(err) } jsonData, err := json.Marshal(tracks) if err != nil { log.Fatal(err) } fmt.Printf(string(jsonData)) }
运行结果
修正后代码可正确解析XML并转换为JSON,输出如下:
{"clid":"020","track_list":[{"uuid":"551","category":"s","route":"8","vehicle_type":"trolleybus","point":{"latitude":"53.61491","longitude":"55.90922","avg_speed":"24","direction":"270","time":"13122022:072116"}},{"uuid":"552","category":"s","route":"6","vehicle_type":"trolleybus","point":{"latitude":"53.68321","longitude":"57.90922","avg_speed":"42","direction":"181","time":"13122022:072216"}}]}
内容的提问来源于stack exchange,提问作者Anton Vikhlyaev
相关产品推荐
相关产品推荐

