Golang Tips: XML 格式数据处理

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

内容简介: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))
}

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

查看所有标签

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

Bad Blood

Bad Blood

John Carreyrou / Knopf / 2018-5-21 / USD 27.95

The full inside story of the breathtaking rise and shocking collapse of Theranos, the multibillion-dollar biotech startup, by the prize-winning journalist who first broke the story and pursued it to t......一起来看看 《Bad Blood》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

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

RGB CMYK 互转工具