概述
encoding/xml
蕴含了 XML 相干解决办法。
例子
构造体转为 XML 字符串
调用 xml.Marshal()
办法实现。
package main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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>
*/