1、简单的序列化与反序列化
package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type Person struct{
Name string `xml:"ppp,attr"` // Name解析成ppp,attr解析成属性
Age int
}
func main(){
var data []byte
var err error
//struct marshal xml
p := Person{Name:"lqh",Age: 34}
if data,err := xml.Marshal(p);err != nil{
fmt.Println(err)
} else {
fmt.Println(string(data))
}
fmt.Println("------------------------------")
// 前缀,缩进
if data,err = xml.MarshalIndent(p,""," ");err != nil{
fmt.Println(err)
} else {
fmt.Println(string(data))
}
// xml unmarshal struct
p2 := new(Person)
if err = xml.Unmarshal(data,&p2);err == nil{
fmt.Println(p2)
}
// struct marshal json
if data,err = json.Marshal(p);err != nil{
fmt.Println(err)
} else {
fmt.Println(string(data))
}
// json unmarshal struct
p3 := Person{}
json.Unmarshal(data,&p3)
fmt.Println(p3)
}
2、复杂的xml解析
xml.data
<sites>
<site>
<name>菜鸟教程</name>
<url name="ppp">www.runoob.com</url>
</site>
<site>
<name>Google</name>
<url>www.google.com</url>
</site>
<site>
<name>淘宝</name>
<url>www.taobao.com</url>
</site>
</sites>
xml解析
package main
import (
"bytes"
"encoding/xml"
"fmt"
"io/ioutil"
)
// 当xml文件结构复杂是不能使用简单的unmarshal进行解析,需要手动解析
func main(){
// 读取文件到内存
data,err := ioutil.ReadFile("data.xml")
if err != nil{
fmt.Println(err)
}
decoder := xml.NewDecoder(bytes.NewBuffer(data))
var t xml.Token
var inSite bool
var isPrint bool
// decoder.Token() 获取xml的节点,返回的是下一个节点
for t,err = decoder.Token();err == nil;t,err = decoder.Token() {
switch token := t.(type) {
case xml.StartElement:
name := token.Name.Local
// 找第一个site下的带有name 属性的url
isPrint = false
if inSite {
if name == "url" {
for _,attr := range token.Attr{
if attr.Name.Local == "name"{
isPrint = true
fmt.Println(attr.Value)
}
}
}
} else {
if name == "site"{
inSite = true
}
}
case xml.EndElement:
if token.Name.Local == "site"{
inSite = false
}
case xml.CharData:
if isPrint {
fmt.Println(string(token)) // 打印节点的值
}
case xml.Comment:
//fmt.Println(token) // 打印节点注释
}
}
}