2017-11-17 114 views
-2

我是新來的,試圖讓下面一段代碼無法運行。看起來我沒有正確編碼結構的結構部分。幫幫我!從結構中編碼xml

package main 

import (
    "encoding/xml" 
    "fmt" 
    "os" 
) 

func main() { 

    type Person struct { 
     Email string `xml:"email"` 
     Phone string `xml:"phone"` 
    } 

    type Host struct { 
     Hostname string `xml:"hostname"` 
     Address string `xml:"address"` 
    } 

    type Asset struct { 
     person Person 
     host Host 
    } 

    p := &Person{Email: "[email protected]", Phone: "1111"} 
    h := &Host{Hostname: "boxen", Address: "1 Place St"} 
    a := &Asset{person: *p, host: *h} 

    enc := xml.NewEncoder(os.Stdout) 
    enc.Indent(" ", " ") 
    if err := enc.Encode(p); err != nil { 
     fmt.Printf("error: %v\n", err) 
    } 
    if err := enc.Encode(h); err != nil { 
     fmt.Printf("error: %v\n", err) 
    } 
    if err := enc.Encode(a); err != nil { 
     fmt.Printf("error: %v\n", err) 
    } 
} 

Go playground here

預期輸出。我目前得到的是一個空的資產元素。

<Asset> 
    <Person> 
    <email>[email protected]</email> 
    <phone>1111</phone> 
    </Person> 
    <Host> 
    <hostname>boxen</hostname> 
    <address>1 Place St</address> 
    </Host> 
</Asset> 
+1

你能更具體?它不起作用的是什麼,你想要它做什麼,它實際上做了什麼? – Adrian

+1

我是第二個@Adrian說的,而且還要做任何編碼/解碼你必須導出你的領域,資產沒有。 – mkopriva

回答

1

你必須使自己的名字開始用大寫字母導出「資產」類型的屬性:

type Asset struct { 
    Person Person 
    Host Host 
} 
3

只要personhost是導出,也沒有辦法爲enc.Encode瞭解他們。導出它們會給你想要的輸出。

package main 

import (
    "encoding/xml" 
    "fmt" 
    "os" 
) 

func main() { 

    type Person struct { 
     Email string `xml:"email"` 
     Phone string `xml:"phone"` 
    } 

    type Host struct { 
     Hostname string `xml:"hostname"` 
     Address string `xml:"address"` 
    } 

    type Asset struct { 
     Person Person 
     Host Host 
    } 

    p := &Person{Email: "[email protected]", Phone: "1111"} 
    h := &Host{Hostname: "boxen", Address: "1 Place St"} 
    a := &Asset{Person: *p, Host: *h} 

    enc := xml.NewEncoder(os.Stdout) 
    enc.Indent(" ", " ") 

    if err := enc.Encode(a); err != nil { 
     fmt.Printf("error: %v\n", err) 
    } 
}