Xml

概述 #

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

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。

© 蛮荆 | 陕公网安备 61011302001681 号 | 陕ICP备2023004378号-1 | Rendered by Hugo