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);//循环打印Bookfor _, 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{}和类型断言,我们可以解析未知结构的jsonfor _, 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"`;//字段定义中有-,表示该字段不会输出到jsonTemp string `json:"-"`;//,omitempty表示如果字段值为空,不会输出到jsonEmpty 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及其解析

    10分钟掌握XML.JSON及其解析 转载于:https://www.cnblogs.com/kira2will/p/4086047.html

  2. iOS进阶(XML、JSON数据解析)

    1.XML解析之DOM解析 需要用到libxml2.dylib框架 和GDataXMLNode工具 DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中.从而消耗很大的内存空间.DOM ...

  3. golang(8):使用golang 的 encoding/json 做解析,然后转换成 create sql

    前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/88837310 未经博主允许不得转载. 博主地址是:http://blog ...

  4. spark中读取json_【spark】文件读写和JSON数据解析

    1.读文件 通过 sc.textFile("file://")方法来读取文件到rdd中. val lines = sc.textFile("file://")/ ...

  5. Golang json 解析与生成

    文章目录 1.解析 json 1.1 map[string]interface{} 存储 json 1.2 struct 存储 json 1.3 []map[string]interface{} 解析 ...

  6. XML与JSON的生成与解析

    1. XML 1.1 XML简介 可标记语言(extensible Markup Language) 特性: XML具有平台无关性,是一门独立的语言 XML具有自我描述性 XML功能: 网络传输文件 ...

  7. JavaSE——XML与JSON(语法格式、解析内容)

    第6节 XML与JSON 一.XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) . 特性: xml具有平台无关性,是一门独立的标记语言: ...

  8. C#合成解析XML与JSON

      http://www.xuanyusong.com/archives/1901  XML与JSON在开发中非常重要, 其实核心就是处理字符串.一个是XML的字符串一个是JSON的字符串,尤其是在处 ...

  9. Python 解析构建数据大杂烩 -- csv、xml、json、excel

    Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...

最新文章

  1. 亚马逊ses如何发qq_使用Amazon SES发送电子邮件
  2. 正则表达式中^的用法
  3. C#GDI+编程基础
  4. 干货分享:什么是Java设计工厂模式?
  5. 如何使用PyCharm调试Python代码
  6. 【转载】:单例设计模式
  7. iPhone13真香了?苹果官网被抢崩了,连夜补货!粉色或成爆款..
  8. 牛客 —— 湖南大学第十六届程序设计竞赛(重现赛)
  9. day17【前台】支付案例
  10. 什么是Apache Flink
  11. 2020年 福建物联网产值或达千亿
  12. 雷林鹏分享:PHP 表单 - 验证邮件和URL
  13. 【转】从CSDN的趣味题学C# 3.0
  14. 《人.地.城》读书笔记
  15. CEO如何选拔和留住数字化人才
  16. Copy ‘XXXX‘ to effectively final temp variable
  17. (转)Spring事务异常回滚机制(出处在文末,转自李慕白大神)
  18. NLog NETCore 3.0 Porting
  19. 从数码宝贝看spring bean的生命周期
  20. Vue + vite 切换 favicon图标

热门文章

  1. 句法模式识别(两)-正规文法、上下文无关文法
  2. Struts2的拦截器只允许有权限用户访问action
  3. asp.NET自定义服务器控件内部细节系列教程四
  4. MATLAB【二】————图像做减法,批量文本处理,子图显示
  5. linux的more 命令
  6. 如何查看linux版本
  7. 手机内存RAM、ROM简介
  8. Ubuntu 14.04 64位机上不带CUDA支持的Caffe配置编译操作过程
  9. API Sanity Checker在Ubuntu中的使用
  10. 设计模式之单例模式(Singleton)摘录