2014-05-08 85 views
1

我試圖解碼下面的xml。對於一些原因,我不能解碼Id在golang中解碼XML

package main 

import (
    "encoding/xml" 
    "fmt" 
) 

var data = ` 
<g xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ad="http://www.myschema.com/schema/ad/v1"> 
    <a xlink:href="http://example.com" data-bind="121">lala</a> 
    <ad:ad id="1060469006"> 
</g> 
` 

type Anchor struct { 
    DataBind int `xml:"data-bind,attr"` 
    XlinkHref string `xml:"http://www.w3.org/1999/xlink href,attr"` 
    Id int `xml:"http://www.myschema.com/schema/ad/v1 id,attr"` 
} 

type Group struct { 
    A Anchor `xml:"a"` 
} 

func main() { 
    group := Group{} 
    _ = xml.Unmarshal([]byte(data), &group) 

    fmt.Printf("%#v\n", group.A) 
} 

Play

回答

4

爲正在尋找在XML中<a>元素上的ad:id屬性你解碼結構。有兩個原因不起作用:

  1. id屬性位於不同的元素上。
  2. id屬性不在http://www.myschema.com/schema/ad/v1命名空間中。沒有名稱空間前綴的屬性不會繼承其元素的名稱空間:相反,它們是空白名稱空間的一部分。

因此,要解決這個問題,首先你需要另一個領域Group與標籤xml:"http://www.myschema.com/schema/ad/v1 ad",並且該字段的結構定義需要與標籤xml:"id,attr"其自己的領域。

+0

第2項:這不是我對規範的理解:http://www.w3.org/TR/REC-xml-names/#defaulting - 「...前綴的屬性的解釋由元素決定他們看起來......「。所以這對我來說似乎有點模糊。 – topskip

+0

剛纔你引用的部分是「默認名稱空間聲明不直接應用於屬性名稱」。就通用XML處理工具而言,這些屬性被認爲不屬於任何名稱空間(即空白名稱空間)。 –