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))
}

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

查看所有标签

猜你喜欢:

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

计算广告

计算广告

刘鹏、王超 / 人民邮电出版社 / 2015-9-1 / 69.00元

计算广告是一项新兴的研究课题,它涉及大规模搜索和文本分析、信息获取、统计模型、机器学习、分类、优化以及微观经济学等诸多领域的知识。本书从实践出发,系统地介绍计算广告的产品、问题、系统和算法,并且从工业界的视角对这一领域具体技术的深入剖析。 本书立足于广告市场的根本问题,从计算广告各个阶段所遇到的市场挑战出发,以广告系统业务形态的需求和变化为主线,依次介绍合约广告系统、竞价广告系统、程序化交易......一起来看看 《计算广告》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具