golang中解析xml时我们通常会创建与之对应的结构体,一层层嵌套,完成复杂的xml解析。

package main;

import (
"encoding/xml"
"fmt"
) //我们通过定义一个结构体,来解析xml
//注意,结构体中的字段必须是可导出的
type Books struct {
//如果有类型为xml.Name的XMLName字段,则解析时会保存元素名到该字段
XMLName xml.Name `xml:"books"`;
//定义的字段中包含,attr,则解析时会把对应字段的属性值赋给该字段
Nums int `xml:"nums,attr"`;
//定义的字段名含有xml中元素名,则解析时会把该元素值赋给该字段
Book []Book `xml:"book"`;
//字段类型为string或[]byte,并且包含,innerxml,则解析时会把此字段对应的元素内所有原始xml累加到字段上
Data string `xml:",innerxml"`;
//字段定义包含-,则解析时不会为该字段匹配任何数据
Tmp int `xml:"-"`;
} type Book struct {
XMLName xml.Name `xml:"book"`;
Name string `xml:"name,attr"`;
Author string `xml:"author"`;
Time string `xml:"time"`;
//字段定义如a>b>c,这样,解析时会从xml当前节点向下寻找元素并将值赋给该字段
Types []string `xml:"types>type"`;
//字段定义有,any,则解析时如果xml元素没有与任何字段匹配,那么这个元素就会映射到该字段
Test string `xml:",any"`;
} func main() {
//xml数据字符串
data := `<?xml version="1.0" encoding="utf-8"?>
<books nums="2">
<book name="思想">
<author>小张</author>
<time>2018年1月20日</time>
<types>
<type>教育</type>
<type>历史</type>
</types>
<test>我是多余的</test>
</book>
<book name="政治">
<author>小王</author>
<time>2018年1月20日</time>
<types>
<type>科学</type>
<type>人文</type>
</types>
<test>我是多余的</test>
</book>
</books>`; //创建一个Books对象
bs := Books{};
//把xml数据解析成bs对象
xml.Unmarshal([]byte(data), &bs);
//打印bs对象中数据
fmt.Println(bs.XMLName);
fmt.Println(bs.Nums);
fmt.Println(bs.Tmp);
//循环打印Book
for _, v := range bs.Book {
fmt.Println(v.XMLName);
fmt.Println(v.Name);
fmt.Println(v.Author);
fmt.Println(v.Time);
fmt.Println(v.Types);
fmt.Println(v.Test);
}
}

反之,通过创建结构体对象,生成xml数据

package main;

import (
"encoding/xml"
"fmt"
) //注意,结构体中的字段必须是可导出的
type Books struct {
XMLName xml.Name `xml:"books"`;
Nums int `xml:"nums,attr"`;
Book []Book `xml:"book"`;
} type Book struct {
XMLName xml.Name `xml:"book"`;
Name string `xml:"name,attr"`;
Author string `xml:"author"`;
Time string `xml:"time"`;
} func main() {
bs := Books{Nums: 666};
//通过append添加book数据
bs.Book = append(bs.Book, Book{Name: "小红", Author: "阿三", Time: "2018年6月3日"});
bs.Book = append(bs.Book, Book{Name: "小绿", Author: "阿四", Time: "2018年6月5日"});
//通过MarshalIndent,让xml数据输出好看点
data, _ := xml.MarshalIndent(&bs, "", " ");
fmt.Println(string(data));
}

  

json数据的解析,很多时候我们并不知道json的具体结构,这就需要我们灵活使用interface{}和类型断言来进行解析。

package main;

import (
"encoding/json"
"fmt"
) //创建一个结构体,用来解析json
//注意结构体中字段必须是可导出的
type People struct {
Name string;
Age int;
Sex string;
Love []string;
} func main() {
//这是一串json数据
//golang中json中的字段名也要加双引号,不然无法解析
data := `{
"name": "小张",
"age": 27,
"sex": "男",
"love": ["看书", "旅游", "健身"]
}`;
//我们创建一个people对象
p := People{};
//解析到结构
json.Unmarshal([]byte(data), &p);
fmt.Printf("%#v\n", p);
fmt.Println(p.Name);
fmt.Println(p.Age);
fmt.Println(p.Sex);
fmt.Println(p.Love); //解析到一个interface{}
//golang中通过map[string]interface{}或[]interface{}来解析任意的对象和数组
var p2 interface{};
json.Unmarshal([]byte(data), &p2);
fmt.Printf("%#v\n", p2); //我们通过类型断言来访问数据
//先将p2转换成map[string]interface{}类型
p3 := p2.(map[string]interface{});
//然后遍历
for i, v := range p3 {
switch vv := v.(type) {
case string:
fmt.Println(i, "string: ", vv);
case int:
fmt.Println(i, "int: ", vv);
case []interface{}:
//通过interface{}和类型断言,我们可以解析未知结构的json
for _, vl := range vv {
fmt.Println(i, "[]interface{}: ", vl);
}
}
}
}

通过结构体对象生成json数据

package main;

import (
"encoding/json"
"fmt"
) //注意结构体的字段必须是可导出的
type Book struct {
//"name"表示指定json输出的名字
Name string `json:"name"`;
Author string `json:"author"`;
Time string `json:"time"`;
//,string表示字段输出时会把字段值转成字符串
Nums int `json:"nums,string"`;
//字段定义中有-,表示该字段不会输出到json
Temp string `json:"-"`;
//,omitempty表示如果字段值为空,不会输出到json
Empty string `json:"empty,omitempty"`;
} type BookList struct {
Books []Book `json:"books"`;
} func main() {
bl := BookList{
Books: []Book{
Book{Name: "一本书", Author: "小张", Time: "2018年1月20日", Nums: 233, Temp: "临时", Empty: ""},
Book{Name: "二本书", Author: "小王", Time: "2018年1月12日", Nums: 233, Temp: "临时", Empty: "不为空"},
},
}
data, _ := json.MarshalIndent(bl, "", " ");
fmt.Println(string(data));
}

  

golang xml和json的解析与生成的更多相关文章

  1. 10分钟掌握XML、JSON及其解析

    引言 NOKIA 有句著名的广告语:“科技以人为本”.任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌 ...

  2. json的解析和生成

    相比于xml,json的主要特点是数据小,解析速度快,但是描述性差. java中常见的json解析方法有Gson.Jackson.JSON.simple. 从解析速度上来看,Gson适合解析小数据量, ...

  3. iOS高级编程之XML,JSON数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  4. (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

    自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...

  5. 将场景导出XML或JSON或二进制而且解析还原场景

    导出unity场景的全部游戏对象信息,一种是XML一种是JSON. 本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON ...

  6. Android基础总结(12)——XML和JSON解析

    XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...

  7. [Network] HTML、XML和JSON学习汇总

    写在前面:楼主也是刚刚接触这方面的知识,之前完全是零基础,后来经朋友推荐了几个不错的博文,看完以后豁然开朗.但是此博文更加偏重于基础知识介绍(其实更深的楼主也还不了解,这方面的大神请绕道),只是分享个 ...

  8. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  9. 用xml还是json

    1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允 ...

随机推荐

  1. decode 函数用法

    含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN ...

  2. java split函数结尾空字符串被丢弃的问题

    参考: http://yinny.iteye.com/blog/1750210 http://www.xuebuyuan.com/1692988.html java中的split函数用于将字符串分割为 ...

  3. openwrt手工配置pptpd

    官方wiki:http://wiki.openwrt.org/doc/howto/vpn.server.pptpd#prerequisites 20190220更新:PPTP VPN协议已经被 IOS ...

  4. list 转datatable

    //public static DataTable ListToDataTable(List<FwImage> entitys) //{ // //检查实体集合不能为空 // if (en ...

  5. Android进阶AIDL - 2018年4月14日

    参考:慕课网 --- 最后三集.Android开发艺术探索 1.在AS中创建aidl文件后,要编译一下才会在gen下生成debug文件: 2.AIDL 不支持short类型,常用的数据类型: 3.AI ...

  6. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  7. opencv对手写数字进行无黏连切割

    //src:待分割的二值图,最大值为255 //segMat:分割好的每个图片 //算法:判断连通域,有几个连通域就会分割成几个子图片 //用途:手写数字识别中进行无黏连数字的分割 void getC ...

  8. 定时删除文件夹"$1"下最后修改时间大于当前时间"$2"天的文件

    shell 脚本: #!/bin/bash now=`date "+%Y-%m-%d_%H:%M:%S"`      #获取当前时间 echo "当前时间: " ...

  9. linux下的arm汇编程序

    1.gnu 的编译环境搭建 解压编译工具,加入环境变量PATH 2.编译相关命令的使用 编译命令 arm-linux-gcc  -g -c -o led.o main.o led.c main.c / ...

  10. node 跨域

    app.post('/api/list',function(req, res){ let reqOrigin = req.headers.origin; // request响应头的origin属性 ...