2013-02-18 177 views
2

我对Go比较陌生,但正在努力完成一项基本任务。我使用“encoding/xml”包解析GPX文件,并具有以下示例xml数据;解析XML名称空间节点

<gpx creator="StravaGPX" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"> 
<metadata> 
    <time>2013-02-16T10:11:25Z</time> 
</metadata> 
<trk> 
    <name>Demo Data</name> 
    <trkseg> 
    <trkpt lat="51.6395658" lon="-3.3623858"> 
    <ele>111.6</ele> 
    <time>2013-02-16T10:11:25Z</time> 
    <extensions> 
    <gpxtpx:TrackPointExtension> 
     <gpxtpx:atemp>8</gpxtpx:atemp> 
     <gpxtpx:hr>136</gpxtpx:hr> 
     <gpxtpx:cad>0</gpxtpx:cad> 
    </gpxtpx:TrackPointExtension> 
    </extensions> 
    </trkpt> 

到目前为止,我能够获得以下类型的最基本的信息;

type Gpx struct { 
    Creator string `xml:"creator,attr"` 
    Time string `xml:"metadata>time"` 
    Title string `xml:"trk>name"` 
    TrackPoints []TrackPoint `xml:"trk>trkseg>trkpt"` 
} 

type TrackPoint struct { 
    Lat float64 `xml:"lat,attr"` 
    Lon float64 `xml:"lon,attr"` 
    Elevation float32 `xml:"ele"` 
    Time string `xml:"time"` 
    Temperature int `xml:"extensions>gpxtpx>atemp"` 
} 

在哪里,我无法分析是TrackPoint.Temperature。我无法使标签正确匹配扩展名下方的名称空间节点。

任何关于我哪里出错的建议?

回答

1

您的目标是命名空间,而不是TrackPoint.Temperature xml说明中的变量名称。

变化

Temperature int `xml:"extensions>gpxtpx>atemp"` 

Temperature int `xml:"extensions>TrackPointExtension>atemp"` 

在操场Here's a working copy

package main 

import (
    "fmt" 
    "encoding/xml" 
    ) 

type Gpx struct { 
    Creator string `xml:"creator,attr"` 
    Time string `xml:"metadata>time"` 
    Title string `xml:"trk>name"` 
    TrackPoints []TrackPoint `xml:"trk>trkseg>trkpt"` 
} 

type TrackPoint struct { 
    Lat float64 `xml:"lat,attr"` 
    Lon float64 `xml:"lon,attr"` 
    Elevation float32 `xml:"ele"` 
    Time string `xml:"time"` 
    Temperature int `xml:"extensions>TrackPointExtension>atemp"` 
} 

func main() { 
    data := `<gpx creator="StravaGPX" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"> 
<metadata> 
    <time>2013-02-16T10:11:25Z</time> 
</metadata> 
<trk> 
    <name>Demo Data</name> 
    <trkseg> 
    <trkpt lat="51.6395658" lon="-3.3623858"> 
    <ele>111.6</ele> 
    <time>2013-02-16T10:11:25Z</time> 
    <extensions> 
    <gpxtpx:TrackPointExtension> 
     <gpxtpx:atemp>8</gpxtpx:atemp> 
     <gpxtpx:hr>136</gpxtpx:hr> 
     <gpxtpx:cad>0</gpxtpx:cad> 
    </gpxtpx:TrackPointExtension> 
    </extensions> 
    </trkpt> 
    </trkseg> 
</trk> 
` 
    g := &Gpx{} 
    _ = xml.Unmarshal([]byte(data), g) 
    fmt.Printf("len: %d\n", len(g.TrackPoints)) 
    fmt.Printf("temp: %v\n", g.TrackPoints[0].Temperature) 
} 
+0

完美,谢谢! – Kevin 2013-02-18 22:58:21