为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 unmarshal 解析 gpx

如何使用 unmarshal 解析 gpx

Go
德玛西亚99 2022-05-05 15:53:05
我想解析一个 GPX 文件。我想得到以下信息:文件中的所有点 (trkpt) 及其值:经度纬度海拔时间为此,我编写了结构:type gpx file{    filepointer *os.file    points []xmlPoints}type gpx struct {    XMLName xml.Name `xml:"gpx"`    trks trk `xml:"trk"`}type trk struct {    XMLName xml.Name `xml:"trk"`    trksegs []trkseg `xml:"trkseg"`}type trkseg struct {    XMLName xml.Name   `xml:"trkseg"`    points  []XMLPoint `xml:"trkpt"`}type XMLPoint struct {    XMLName   xml.Name  `xml:"trkpt"`    longitude float64   `xml:"lon,attr"`    latitude  float64   `xml:"lat,attr"`    elevation float64   `xml:"ele"`    time      time.Time `xml:"time"`}我使用以下方法尝试获取这些值:func (f *GPXFile) setPoints() {    //Reads the GPXfile to get a slice of all Points and set them to f.points    //read GPXFile    file, _ := os.Open(f.filePointer.Name())    fileByte, _ := ioutil.ReadAll(file)    //get points    var g gpx    //should read points and puts them to &points, result empty    err :=xml.Unmarshal(fileByte, &g)    fmt.Print(err)    //set points    f.points = g.trks.trksegs[1].points}我的 GPX 文件如下所示:<?xml version="1.0" encoding="UTF-8"?><gpx version="1.1" ...> <metadata>  <time>2019-09-14T13:14:17.094Z</time> </metadata> <trk>  <name>Cube – Sa., 14. Sep. 2019, 15:14</name>  <trkseg>  </trkseg>  <trkseg>   <trkpt lat="49.3547198000" lon="9.1508659200"><time>2019-09-14T13:14:00.000Z</time><extensions><gpxpx:PowerInWatts>120</gpxpx:PowerInWatts></extensions></trkpt>   <trkpt lat="49.3546998700" lon="9.1509324100"><time>2019-09-14T13:14:10.003Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:atemp>22.9</gpxtpx:atemp></gpxtpx:TrackPointExtension><gpxpx:PowerInWatts>120</gpxpx:PowerInWatts></extensions></trkpt>  </trkseg> </trk></gpx>问题是,从 unmarshal 函数中我得到了一个with ,gpx但是trk它是trkseqnil ... 所以我想知道如何解析. 从那里我可以使用相同的方法来获取点数组。trkseqtrktrkseqtrkseq
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

在 golang 中编组/解组任何类型的编码/序列化数据时,您解组的interface{}类型在某个时候作为类型传递。(未)编组代码将不得不依赖reflect包来查找可用于将数据映射到的标签和字段。此代码可以使用(和写入)的唯一字段是导出字段(以大写字母开头的字段)。您的类型都有未导出的字段和类型(如果您愿意,可以使用私有)。


只需更改如下内容:


type gpx struct {

    XMLName xml.Name `xml:"gpx"`

    trks    trk      `xml:"trk"`

}


type Gpx struct {

    XMLName xml.Name `xml:"gpx"`

    Trks    Trk      `xml:"trk"`

}

此外,在 Golang 中,约定是对首字母缩写词使用全部大写(例如URL,not urlor Url),因此可以说,您会想要:


type GPX struct {

    XMLName xml.Name `xml:"gpx"`

    TRKS    TRK      `xml:"trk"`

}


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号