解析XML命名空间节点

huangapple go评论122阅读模式
英文:

Parsing XML namespaced nodes

问题

我对Go相对较新,但在一个基本任务上遇到了困难。我正在使用"encoding/xml"包解析一个GPX文件,并有以下示例xml数据;

  1. <gpx creator="StravaGPX" version="1.1" xmlns="http://www.topografix.com/GPX/1/1"
  2. 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">
  3. <metadata>
  4. <time>2013-02-16T10:11:25Z</time>
  5. </metadata>
  6. <trk>
  7. <name>Demo Data</name>
  8. <trkseg>
  9. <trkpt lat="51.6395658" lon="-3.3623858">
  10. <ele>111.6</ele>
  11. <time>2013-02-16T10:11:25Z</time>
  12. <extensions>
  13. <gpxtpx:TrackPointExtension>
  14. <gpxtpx:atemp>8</gpxtpx:atemp>
  15. <gpxtpx:hr>136</gpxtpx:hr>
  16. <gpxtpx:cad>0</gpxtpx:cad>
  17. </gpxtpx:TrackPointExtension>
  18. </extensions>
  19. </trkpt>

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

  1. type Gpx struct {
  2. Creator string `xml:"creator,attr"`
  3. Time string `xml:"metadata>time"`
  4. Title string `xml:"trk>name"`
  5. TrackPoints []TrackPoint `xml:"trk>trkseg>trkpt"`
  6. }
  7. type TrackPoint struct {
  8. Lat float64 `xml:"lat,attr"`
  9. Lon float64 `xml:"lon,attr"`
  10. Elevation float32 `xml:"ele"`
  11. Time string `xml:"time"`
  12. Temperature int `xml:"extensions>gpxtpx>atemp"`
  13. }

我在TrackPoint.Temperature的解析中失败了。我无法正确匹配扩展节点下的命名空间节点。

有关我出错的地方有什么建议吗?

英文:

I am relatively new to Go but struggling with a basic task. I am parsing a GPX file using the "encoding/xml" package and have the following example xml data;

  1. &lt;gpx creator=&quot;StravaGPX&quot; version=&quot;1.1&quot; xmlns=&quot;http://www.topografix.com/GPX/1/1&quot;
  2. xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;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&quot; xmlns:gpxtpx=&quot;http://www.garmin.com/xmlschemas/TrackPointExtension/v1&quot; xmlns:gpxx=&quot;http://www.garmin.com/xmlschemas/GpxExtensions/v3&quot;&gt;
  3. &lt;metadata&gt;
  4. &lt;time&gt;2013-02-16T10:11:25Z&lt;/time&gt;
  5. &lt;/metadata&gt;
  6. &lt;trk&gt;
  7. &lt;name&gt;Demo Data&lt;/name&gt;
  8. &lt;trkseg&gt;
  9. &lt;trkpt lat=&quot;51.6395658&quot; lon=&quot;-3.3623858&quot;&gt;
  10. &lt;ele&gt;111.6&lt;/ele&gt;
  11. &lt;time&gt;2013-02-16T10:11:25Z&lt;/time&gt;
  12. &lt;extensions&gt;
  13. &lt;gpxtpx:TrackPointExtension&gt;
  14. &lt;gpxtpx:atemp&gt;8&lt;/gpxtpx:atemp&gt;
  15. &lt;gpxtpx:hr&gt;136&lt;/gpxtpx:hr&gt;
  16. &lt;gpxtpx:cad&gt;0&lt;/gpxtpx:cad&gt;
  17. &lt;/gpxtpx:TrackPointExtension&gt;
  18. &lt;/extensions&gt;
  19. &lt;/trkpt&gt;

So far I am able to get at the most basic info with the following types;

  1. type Gpx struct {
  2. Creator string `xml:&quot;creator,attr&quot;`
  3. Time string `xml:&quot;metadata&gt;time&quot;`
  4. Title string `xml:&quot;trk&gt;name&quot;`
  5. TrackPoints []TrackPoint `xml:&quot;trk&gt;trkseg&gt;trkpt&quot;`
  6. }
  7. type TrackPoint struct {
  8. Lat float64 `xml:&quot;lat,attr&quot;`
  9. Lon float64 `xml:&quot;lon,attr&quot;`
  10. Elevation float32 `xml:&quot;ele&quot;`
  11. Time string `xml:&quot;time&quot;`
  12. Temperature int `xml:&quot;extensions&gt;gpxtpx&gt;atemp&quot;`
  13. }

Where I am failing to parse is in TrackPoint.Temperature. I cannot get the tag right to match the namespaced nodes underneath extensions.

Any suggestions as to where I am going wrong?

答案1

得分: 1

你的TrackPoint.Temperature xml指令中,你正在针对一个命名空间而不是一个变量名进行定位。

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

改为

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

在playground中,这是一个工作副本。

  1. package main
  2. import (
  3. "fmt"
  4. "encoding/xml"
  5. )
  6. type Gpx struct {
  7. Creator string `xml:"creator,attr"`
  8. Time string `xml:"metadata>time"`
  9. Title string `xml:"trk>name"`
  10. TrackPoints []TrackPoint `xml:"trk>trkseg>trkpt"`
  11. }
  12. type TrackPoint struct {
  13. Lat float64 `xml:"lat,attr"`
  14. Lon float64 `xml:"lon,attr"`
  15. Elevation float32 `xml:"ele"`
  16. Time string `xml:"time"`
  17. Temperature int `xml:"extensions>TrackPointExtension>atemp"`
  18. }
  19. func main() {
  20. data := `<gpx creator="StravaGPX" version="1.1" xmlns="http://www.topografix.com/GPX/1/1"
  21. 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">
  22. <metadata>
  23. <time>2013-02-16T10:11:25Z</time>
  24. </metadata>
  25. <trk>
  26. <name>Demo Data</name>
  27. <trkseg>
  28. <trkpt lat="51.6395658" lon="-3.3623858">
  29. <ele>111.6</ele>
  30. <time>2013-02-16T10:11:25Z</time>
  31. <extensions>
  32. <gpxtpx:TrackPointExtension>
  33. <gpxtpx:atemp>8</gpxtpx:atemp>
  34. <gpxtpx:hr>136</gpxtpx:hr>
  35. <gpxtpx:cad>0</gpxtpx:cad>
  36. </gpxtpx:TrackPointExtension>
  37. </extensions>
  38. </trkpt>
  39. </trkseg>
  40. </trk>
  41. `
  42. g := &Gpx{}
  43. _ = xml.Unmarshal([]byte(data), g)
  44. fmt.Printf("len: %d\n", len(g.TrackPoints))
  45. fmt.Printf("temp: %v\n", g.TrackPoints[0].Temperature)
  46. }
英文:

You're targeting a namespace instead of a variable name in your TrackPoint.Temperature xml instructions.

Change

  1. Temperature int `xml:&quot;extensions&gt;gpxtpx&gt;atemp&quot;`

To

  1. Temperature int `xml:&quot;extensions&gt;TrackPointExtension&gt;atemp&quot;`

<a href="http://play.golang.org/p/992Ozf7fn1">Here's a working copy</a> in the playground.

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;encoding/xml&quot;
  5. )
  6. type Gpx struct {
  7. Creator string `xml:&quot;creator,attr&quot;`
  8. Time string `xml:&quot;metadata&gt;time&quot;`
  9. Title string `xml:&quot;trk&gt;name&quot;`
  10. TrackPoints []TrackPoint `xml:&quot;trk&gt;trkseg&gt;trkpt&quot;`
  11. }
  12. type TrackPoint struct {
  13. Lat float64 `xml:&quot;lat,attr&quot;`
  14. Lon float64 `xml:&quot;lon,attr&quot;`
  15. Elevation float32 `xml:&quot;ele&quot;`
  16. Time string `xml:&quot;time&quot;`
  17. Temperature int `xml:&quot;extensions&gt;TrackPointExtension&gt;atemp&quot;`
  18. }
  19. func main() {
  20. data := `&lt;gpx creator=&quot;StravaGPX&quot; version=&quot;1.1&quot; xmlns=&quot;http://www.topografix.com/GPX/1/1&quot;
  21. xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;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&quot; xmlns:gpxtpx=&quot;http://www.garmin.com/xmlschemas/TrackPointExtension/v1&quot; xmlns:gpxx=&quot;http://www.garmin.com/xmlschemas/GpxExtensions/v3&quot;&gt;
  22. &lt;metadata&gt;
  23. &lt;time&gt;2013-02-16T10:11:25Z&lt;/time&gt;
  24. &lt;/metadata&gt;
  25. &lt;trk&gt;
  26. &lt;name&gt;Demo Data&lt;/name&gt;
  27. &lt;trkseg&gt;
  28. &lt;trkpt lat=&quot;51.6395658&quot; lon=&quot;-3.3623858&quot;&gt;
  29. &lt;ele&gt;111.6&lt;/ele&gt;
  30. &lt;time&gt;2013-02-16T10:11:25Z&lt;/time&gt;
  31. &lt;extensions&gt;
  32. &lt;gpxtpx:TrackPointExtension&gt;
  33. &lt;gpxtpx:atemp&gt;8&lt;/gpxtpx:atemp&gt;
  34. &lt;gpxtpx:hr&gt;136&lt;/gpxtpx:hr&gt;
  35. &lt;gpxtpx:cad&gt;0&lt;/gpxtpx:cad&gt;
  36. &lt;/gpxtpx:TrackPointExtension&gt;
  37. &lt;/extensions&gt;
  38. &lt;/trkpt&gt;
  39. &lt;/trkseg&gt;
  40. &lt;/trk&gt;
  41. `
  42. g := &amp;Gpx{}
  43. _ = xml.Unmarshal([]byte(data), g)
  44. fmt.Printf(&quot;len: %d\n&quot;, len(g.TrackPoints))
  45. fmt.Printf(&quot;temp: %v\n&quot;, g.TrackPoints[0].Temperature)
  46. }

huangapple
  • 本文由 发表于 2013年2月19日 06:35:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/14946566.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定