2017-11-17 115 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) 
    } 
}