概述
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>*/