2016-03-08 43 views
2

也許有人可以在這裏提供一些見解...我似乎正在用編碼/ XML庫打磚牆。基本上我是從一個GPS文件中解開XML數據,然後將其編組回來到另一個文件中。一切正常,除了根XML < GPX>Go - Unmarshal XML,屬性問題

我已經試過各種

func (c *gpx) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {} 

類型接近無濟於事屬性標記。

基本上我只是希望根標記< GPX>具有正確分配的所有屬性。爲什麼你不能做屬性[] xml.Attr xml:「,attr」或類似的東西超越了我。

良好的XML頭 - >http://pastebin.com/XjEZuBa1

我不能鏈接壞的XML頭,因爲我是一個新成員..但XML解組/編組過程中增加了對_引起的問題,其中的命名空間其他事情。

GO遊樂場鏈接:http://play.golang.org/p/J7wy6306Cj

任何幫助將不勝感激, 謝謝。

+0

歡迎來到SO。作爲提示,將[Playground](http://play.golang.org/)鏈接添加到[MCVE](http://stackoverflow.com/help/mcve)可幫助人們幫助您。 –

+0

謝謝你的迴應。我已經把一些代碼放到Go遊樂場。我相信這複製了我所遇到的問題。 http://play.golang.org/p/J7wy6306Cj –

+0

你的問題是那些'_xmlns:foo'應該是'xmlns:foo'? –

回答

0

不幸的是,默認情況下圍棋XML編碼器不能編碼的東西一樣

xmlns:foo="http://example.com/Foo-V1" foo:attr="bar" 

由於the code shows,它選擇基於URL名稱,你不能只定義命名空間自己。轉到編碼器發出這樣的代碼,據我所知,基本上等同於上面的一個:

xmlns:Foo-V1="http://example.com/Foo-V1" Foo-V1:attr="bar" 

就是不同,這裏是命名空間前綴的唯一的事。至於其他命名空間的前向聲明,我建議只聲明它們在需要它們的元素和屬性上。即編碼類似

<foo xmlns:bar="http://example.com/Bar-V1"> 
    <bar:elem>Hello world</bar:elem> 
</foo> 

使用結構類似這樣的

type Foo struct { 
    XMLName xml.Name `xml:"foo"` 
    BarElem BarElem 
} 

type BarElem struct { 
    XMLName xml.Name `xml:"http://example.com/Bar-V1 elem"` 
    Data string `xml:",innerxml"` 
} 

其序列化爲

<foo> 
    <elem xmlns="http://example.com/Bar-V1">Hello world</elem> 
</foo> 

遊樂場:http://play.golang.org/p/79bhk70yFj

+0

接受的答覆。你是對的,這是Go的XML編碼器的限制。不幸的是,Garmin Basecamp對XML屬性的表現非常自信。因此,我執行了一些基本的字符串操作來獲得所需的結果。不幸的是,因爲其他語言(不提及任何名稱)可以很容易地提供所需的結果。 –