概述

encoding/xml 蕴含了 XML 相干解决办法。

例子

构造体转为 XML 字符串

调用 xml.Marshal() 办法实现。

package mainimport (    "encoding/xml"    "fmt")type person struct {    Name string `xml:"name"`    Age  int    `xml:"age"`    addr string `xml:"addr"` // 该属性转 XML 时会被疏忽}func main() {    tom := person{ // 应用字面量初始化        Name: "Tom",        Age:  6,        addr: "???",    }    tomXml, err := xml.Marshal(tom)    if err != nil {        panic(err)    }    fmt.Printf("xml.Marshal(tom) = %s\n", tomXml) // 从输入字符串中能够看到,并没有 addr 属性}// $ go run main.go// 输入如下 /**  xml.Marshal(tom) = <person><name>Tom</name><age>6</age></person>*/

XML 字符串转为构造体

调用 xml.Unmarshal() 办法实现。

package mainimport (    "encoding/xml"    "fmt")type person struct {    Name string `xml:"name"`    Age  int    `xml:"age"`    addr string `xml:"addr"` // 该属性转 XML 时会被疏忽}func main() {    // 留神: XML 字符串格局肯定要正确,否则会报错    tomXml := `<person>    <name>Tom</name>    <age>6</age>    <addr>???</addr></person>`    var tom person    err := xml.Unmarshal([]byte(tomXml), &tom)    if err != nil {        panic(err)    }    // 从输入字符串中能够看到,并没有为 addr 属性赋值    fmt.Printf("Tom's name is %s, age is %d, addr is %s\n", tom.Name, tom.Age, tom.addr)}// $ go run main.go// 输入如下 /**  Tom's name is Tom, age is 6, addr is*/

输入格式化 XML 字符串

调用 xml.MarshalIndent() 办法实现。

package mainimport (    "encoding/xml"    "fmt")type person struct {    Name  string   `xml:"name"`    Age   int      `xml:"age"`    Hobby []string `xml:"hobby"`}func main() {    tom := person{ // 应用字面量初始化        Name: "Tom",        Age:  6,        Hobby: []string{            "reading",            "coding",            "movie",        },    }    // 前缀符为空字符串,缩进符为 4 个空格    formatted, err := xml.MarshalIndent(tom, "", "    ")    if err != nil {        panic(err)    }    fmt.Printf("xml.MarshalIndent(tom) = \n%s\n", formatted)}// $ go run main.go// 输入如下 /**  xml.MarshalIndent(tom) =  <person>      <name>Tom</name>      <age>6</age>      <hobby>reading</hobby>      <hobby>coding</hobby>      <hobby>movie</hobby>  </person>*/

属性值(版本号)

通过 attr 关键字实现。

package mainimport (    "encoding/xml"    "fmt")type person struct {    Version string `xml:"version,attr"` // attr 关键字将字段标记为属性    Name    string `xml:"name"`    Age     int    `xml:"age"`}func main() {    tom := person{        Version: "1.0",        Name:    "Tom",        Age:     6,    }    formatted, err := xml.MarshalIndent(tom, "", "    ")    if err != nil {        panic(err)    }    fmt.Printf("%s\n", formatted)}// $ go run main.go// 输入如下 /**  <person version="1.0">      <name>Tom</name>      <age>6</age>  </person>*/

疏忽零值

通过 omitempty 关键字实现。

package mainimport (    "encoding/xml"    "fmt")type person struct {    Version string  `xml:"version,attr"`    Name    string  `xml:"name"`    Age     int     `xml:"age"`    Money   float64 `xml:"money,omitempty"` // omitempty 关键字将字段标记为疏忽零值}func main() {    tomNoMoney := person{        Version: "1.0",        Name:    "Tom",        Age:     6,        Money:   0,    }    formatted, err := xml.MarshalIndent(tomNoMoney, "", "    ")    if err != nil {        panic(err)    }    fmt.Printf("%s\n\n", formatted) // 从输入字符串中能够看到,并没有 money 属性    tomHasMoney := person{        Version: "1.0",        Name:    "Tom",        Age:     6,        Money:   100,    }    formatted, err = xml.MarshalIndent(tomHasMoney, "", "    ")    if err != nil {        panic(err)    }    fmt.Printf("%s\n", formatted) // 从输入字符串中能够看到,有 money 属性}// $ go run main.go// 输入如下 /**  <person version="1.0">      <name>Tom</name>      <age>6</age>  </person>  <person version="1.0">      <name>Tom</name>      <age>6</age>      <money>100</money>  </person>*/

分割我