XML Marshal在这个Go示例中不起作用

时间:2017-05-29 22:24:45

标签: xml go marshalling

在此代码中,返回的元素x没有正文 - 我相信MarshalIndent无法正常工作。 我将无法进行结构记录。 是否有任何解决方法,以便可以按预期返回值。

package main

import "fmt"
import "encoding/xml"
import "time"

type Record struct {
    a int64     `xml:"a,omitempty"`
    b int64     `xml:"b,omitempty"`
    c int64     `xml:"c,omitempty"`
    d int64     `xml:"d,omitempty"`
    e int64     `xml:"e,omitempty"`
    f string    `xml:"f,omitempty"`
    g string    `xml:"g,omitempty"`
    h string    `xml:"h,omitempty"`
    i string    `xml:"i,omitempty"`
    j string    `xml:"j,omitempty"`
    k time.Time `xml:"k,omitempty"`
    l time.Time `xml:"l,omitempty"`
    m string    `xml:"m,omitempty"`
    n string    `xml:"n,omitempty"`
    o string    `xml:"o,omitempty"`
    p int64     `xml:"p,omitempty"`
}

func main() {
    temp, _ := time.Parse(time.RFC3339, "")
    candiateXML := &Record{1, 2, 3, 4, 5, "6", "7", "8", "9", "10", temp, temp, "13", "14", "15", 16}
    fmt.Printf("%v\n", candiateXML.a)
    fmt.Printf("%v\n", candiateXML.b)
    fmt.Printf("%v\n", candiateXML.c)
    fmt.Printf("%v\n", candiateXML.d)
    fmt.Printf("%v\n", candiateXML.e)
    fmt.Printf("%s\n", candiateXML.f)
    fmt.Printf("%s\n", candiateXML.g)
    fmt.Printf("%s\n", candiateXML.h)
    fmt.Printf("%s\n", candiateXML.i)
    fmt.Printf("%s\n", candiateXML.j)
    fmt.Printf("%d\n", candiateXML.k)
    fmt.Printf("%d\n", candiateXML.l)
    fmt.Printf("%s\n", candiateXML.m)
    fmt.Printf("%s\n", candiateXML.n)
    fmt.Printf("%s\n", candiateXML.o)
    fmt.Printf("%v\n", candiateXML.p)

    x, err := xml.MarshalIndent(candiateXML, "", "  ")
    if err != nil {
        return
    }
    //why this is not printing properly
    fmt.Printf("%s\n", x)
}

MarshalIndent未返回预期结果。

1 个答案:

答案 0 :(得分:1)

  

The Go Programming Language Specification

     

Exported identifiers

     

可以导出标识符以允许从另一个标识符访问它   包。如果两者都导出标识符:

     
      
  1. 标识符名称的第一个字符是Unicode大写字母(Unicode类" Lu");和
  2.   
  3. 标识符在包块中声明,或者是字段名称或方法名称。
  4.         

    不会导出所有其他标识符。

导出Record结构字段名称(第一个字符大写)以允许从xml包访问它们。例如,

package main

import "fmt"
import "encoding/xml"

type Record struct {
    A int64 `xml:"a,omitempty"`
    B int64 `xml:"b,omitempty"`
    C int64 `xml:"c,omitempty"`
}

func main() {
    candiateXML := &Record{1, 2, 3}
    fmt.Printf("%v\n", candiateXML.A)
    fmt.Printf("%v\n", candiateXML.B)
    fmt.Printf("%v\n", candiateXML.C)

    x, err := xml.MarshalIndent(candiateXML, "", "  ")
    if err != nil {
        return
    }
    fmt.Printf("%s\n", x)
}

输出:

1
2
3
<Record>
  <a>1</a>
  <b>2</b>
  <c>3</c>
</Record>