Golang Tips: XML 格式数据处理

栏目: Go · 发布时间: 6年前

内容简介:Golang Tips: XML 格式数据处理

最近打算开发一个微信公众号, 发现微信公众号的 API 要求的返回值必须是 XML 格式, 于是便研究了下如何使用 Golang 处理 XML 格式的数据, 发现 Golang 标准库就支持 XML 的编码和解码, 使用起来非常简单.

使用 Golang 将 XML 数据反序列化为结构体

首先看一下如何将一段表示微信图文消息的 XML 数据反序列化为 Golang 的结构体:

package main

import (
	"encoding/XML"
	"fmt"
)

type WXNewsMsg struct {
	ToUserName   string           `XML:"ToUserName"`
	FromUserName string           `XML:"FromUserName"`
	CreateTime   uint64           `XML:"CreateTime"`
	MsgType      string           `XML:"MsgType"`
	ArticleCount uint32           `XML:"ArticleCount"`
	Articles     []WXArticlesItem `XML:"Articles>item"`
}

type WXArticlesItem struct {
	Title       string `XML:"Title"`
	Description string `XML:"Description"`
	PicUrl      string `XML:"PicUrl"`
	Url         string `XML:"Url"`
}

func main() {
	XMLStr := `
	<XML>
	<ToUserName>To CodeKillerTips</ToUserName>
	<FromUserName>From CodeKillerTips</FromUserName>
	<CreateTime>12345678</CreateTime>
	<MsgType>news</MsgType>
	<ArticleCount>2</ArticleCount>
	<Articles>
		<item>
			<Title>标题111</Title>
			<Description>内容111</Description>
			<PicUrl>图片URL111</PicUrl>
			<Url>图文跳转链接111</Url>
		</item>
		<item>
			<Title>标题222</Title>
			<Description>内容222</Description>
			<PicUrl>图片URL222</PicUrl>
			<Url>图文跳转链接222</Url>
		</item>
	</Articles>
	</XML>
	`
	v := WXNewsMsg{}
	err := XML.Unmarshal([]byte(XMLStr), &v)
	if err != nil {
		fmt.Println("XML.Unmarshal err:", err)
		return
	}
	fmt.Println("ToUserName:", v.ToUserName)
	fmt.Println("MsgType:", v.MsgType)
	fmt.Println("ArticleCount:", v.ArticleCount)
	fmt.Println("Article 1 title:", v.Articles[0].Title)
	fmt.Println("Article 2 URL:", v.Articles[1].Url)
}

带属性的 XML 数据解码:

package main

import (
	"encoding/XML"
	"fmt"
)

func main() {
	type Email struct {
		Where string `XML:"where,attr"`
		Addr  string
	}
	type Result struct {
		XMLName XML.Name `XML:"Person"`
		Email   []Email
	}
	v := Result{}

	data := `
		<Person>
			<Email where="home">
				<Addr>gre@example.com</Addr>
			</Email>
			<Email where='work'>
				<Addr>gre@work.com</Addr>
			</Email>
		</Person>
	`
	err := XML.Unmarshal([]byte(data), &v)
	if err != nil {
		fmt.Printf("error: %v", err)
		return
	}
	fmt.Printf("XMLName: %#v\n", v.XMLName)
	fmt.Printf("Email num: %d\n", len(v.Email))
	fmt.Printf("Email: %v\n", v.Email)
}

使用 Golang 将结构体序列化为 XML 数据

看了上面反序列化的例子, 然后在序列化结构体是非常简单的, 下面是例子:

package main

import (
	"encoding/XML"
	"fmt"
)

func main() {
	type Email struct {
		Where string `XML:"where,attr"`
		Addr  string
	}
	type Result struct {
		XMLName XML.Name `XML:"Person"`
		Email   []Email
	}
	v := Result{}
	v.Email = append(v.Email, Email{Where: "work", Addr: "ck@work.com"})
	v.Email = append(v.Email, Email{Where: "home", Addr: "ck@home.com"})

	XMLData, err := XML.Marshal(v)
	if err != nil {
		fmt.Println("XML.Marshal err:", err)
		return
	}
	fmt.Println("XMLData:", string(XMLData))
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

商业模式新生代

商业模式新生代

亚历山大•奥斯特瓦德 (Alexander Osterwalder)、伊夫•皮尼厄 (Yves Pigneur) / 王帅、毛心宇、严威 / 机械工业出版社 / 2011-8-15 / 88.00元

中文官网:http://www.bizmodel.org 内容简介:当你愉快的看完第一章:商业模式画布,赫然发现这些构成要素全 都交织成一幅清晰的图像在脑海中呈现,它们如何互相影响、如何交互作用全都历历在目。利用商业模式画布分析瑞士银行、Google、Lego、Wii 、Apple等跨国企业,归纳出三种不同的产业 模式,也涵括新近的热门现象免费效应及长尾理论等。在这些有趣的例子中,我们不仅更......一起来看看 《商业模式新生代》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具