2016-05-28 4 views
2

私はGoでXMLを作成する方法を学んでいます。ここに私のコードだ:GOlangでXMLをマーシャリングする:フィールドが空です(APPENDは機能しません)

type Request struct { 
    XMLName  xml.Name  `xml:"request"` 
    Action  string   `xml:"action,attr"` 
    ... 
    Point   []point   `xml:"point,omitempty"` 
} 

type point struct { 
    geo string `xml:"point"` 
    radius int `xml:"radius,attr"` 
} 

func main() { 
    v := &Request{Action: "get-objects"} 
    v.Point = append(v.Point, point{geo: "55.703038, 37.554457", radius: 10}) 
    output, err := xml.MarshalIndent(v, " ", " ") 
    if err != nil { 
     fmt.Println("error: %v\n", err) 
    } 
    os.Stdout.Write([]byte(xml.Header)) 
    os.Stdout.Write(output) 

} 

私は、出力は次のようになることを期待:

<?xml version="1.0" encoding="UTF-8"?> 
    <request action="get-objects"> 
     <point radius=10>55.703038, 37.554457</point> 
    </request> 

しかし、私は取得していことです:

<?xml version="1.0" encoding="UTF-8"?> 
     <request action="get-objects"> 
      <point></point> 
     </request> 

私は何をしないか、間違っているのでしょうか? "name、attr"というものは、他のすべてのもの(例えば、 "要求"フィールドの場合)には完璧に機能するため、見ることができます。おかげさまで

答えて

1

コードにはいくつかの問題があります。 Goでパッケージをエンコードする場合は、マーシャリング/アンマーシャリングするすべてのフィールドをエクスポートする必要があります。構造体自体をエクスポートする必要はありません。

だから、最初のステップは、フィールドをエクスポートするpoint構造体を変更することです:

type point struct { 
    Geo string `xml:"point"` 
    Radius int `xml:"radius,attr"` 
} 

さて、あなたはポイント内Geoフィールドを表示したい場合は、XMLタグに,cdataを追加する必要があります。最後に、スライスにキーワードomitemptyを追加する必要はありません。

type Request struct { 
    XMLName xml.Name `xml:"request"` 
    Action string `xml:"action,attr"` 
    Point []point `xml:"point"` 
} 

type point struct { 
    Geo string `xml:",chardata"` 
    Radius int `xml:"radius,attr"` 
} 

Go playground

+0

ありがとうございました!そして、他の間違いを指摘してくれてありがとう。 – yellalena

1

マーシャルするメンバをエクスポート(大文字化)する必要があります。試してみてください:encoding/xml docから

type point struct { 
    Geo string `xml:"point"` 
    Radius int `xml:"radius,attr"` 
} 

構造体のXML要素は、構造体の エクスポート各フィールドの整列化要素を含まれています。

[..]

非整列化を反映するパッケージを使用するため、それだけ エクスポート(大文字)フィールドに割り当てることができます。

+0

ありがとうございます!もっと慎重に文書を読んでください。 – yellalena

関連する問題