go标准库之xml模块

378 阅读1分钟

xml 包实现 xml 解析

核心的两个函数

struct 转成 xml ,可以接受任意类型

func Marshal(v interface{}) ([]byte, error)

xml 转成 struct

func Unmarshal(data []byte, v interface{}) error

两个核心结构体

从输出流读取解析 xml

type Decoder struct {
    ...
}

xml 到输入流

type Encoder struct {

}

实例演示

结构体转xml

func Marshal() {
	p := Person{
		Name:  "tom",
		Age:   20,
		Email: "tom@gmail.com",
	}
        // b, _ := xml.Marshal(Person)
        // MarshalIndent可以对齐
	b, _ := xml.MarshalIndent(p, " ", " ")
	fmt.Printf("%v\n", string(b))
}
/*
<person>
  <name>tom</name>
  <age>20</age>
  <email>tom@gmail.com</email>
 </person>
*/

xml转结构体

func Unmarshal() {
	s := `
	<person>
          <name>tom</name>
          <age>20</age>
          <email>tom@gmail.com</email>
        </person>
	`
	b := []byte(s)
	var per Person
	xml.Unmarshal(b, &per)
	fmt.Printf("per: %v\n", per) // per: {{ person} tom 20 tom@gmail.com}
}

读写文件

a.xml

<person>
  <name>tom</name>
  <age>20</age>
  <email>tom@gmail.com</email>
</person>

xml 文件

func read() {
	b, _ := ioutil.ReadFile("a.xml")
	var p Person
	xml.Unmarshal(b, &p)
	fmt.Printf("p: %v\n", p) // p: {{ person} tom 20 tom@gmail.com}
}

xml 文件

func write() {
	type Person struct {
		XMLName xml.Name `xml:"person"`
		Name    string   `xml:"name"`
		Age     int      `xml:"age"`
		Email   string   `xml:"email"`
	}

	p := Person{
		Name:  "tom",
		Age:   20,
		Email: "tom@gmail.com",
	}

	f, _ := os.OpenFile("a.xml", os.O_WRONLY|os.O_CREATE, 0777)
	defer f.Close()
	e := xml.NewEncoder(f)
        // 覆盖对应的位置 后面的不覆盖
	e.Encode(p)
}

b.xml

<person><name>tom</name><age>20</age><email>tom@gmail.com</email></person>