文档章节

golang的xml、json解析

c
 caiyezi
发布于 2016/11/08 20:24
字数 583
阅读 11
收藏 0
点赞 0
评论 0

xml

golang的xml处理主要应用Unmarshal、Marshal方法实现,解析一个xml到struct如下,首先是xml文件:

<?xml version="1.0" encoding="utf-8"?>
<servers version="1.0">
    <!--测试注释server-->
    <server desc="s1">
        <serverName>Shanghai_VPN</serverName>
        <serverIP>127.0.0.1</serverIP>
    </server>
    <server desc="s2">
        <!---->
        <serverName>Beijing_VPN</serverName>
        <serverIP>127.0.0.2</serverIP>
    </server>
</servers>

下面记录下主要代码:

// parse2xml project main.go
package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "os"
)

type Recurlyservers struct {
    XMLName     xml.Name `xml:"servers"`
    Version     string   `xml:"version,attr"`
    Svs         []server `xml:"server"`
    Description string   `xml:",innerxml"`
}

type server struct {
    XMLName    xml.Name `xml:"server"`
    Desc       string   `xml:"desc,attr"`
    ServerName string   `xml:"serverName"`
    ServerIP   string   `xml:"serverIP"`
    TestDesc   string   `xml:",innerxml"`
}

func main() {
    
    file, err := os.Open("servers.xml")
    if err != nil {
        fmt.Printf("%s", err.Error())
        panic(err)
    }
    defer file.Close()
    data, err := ioutil.ReadAll(file)
    v := Recurlyservers{}
    err = xml.Unmarshal(data, &v)
    if err != nil {
        fmt.Printf("%s", err.Error())
        panic(err)
    }
    fmt.Printf("%#v", v)
}

打印结果:

可以发现Unmarshal解析时的一些规则:

1、解析使用struct的tag配置,通过底层反射实现

2、类型为xml.Name的struct字段XMLName对应的是xml中的“父”节点名称,如servers

3、*,attr对应的为当前父节点上的属性名称,如version,attr,对应的便是xml文件中servers节点的version属性

4、tag中仅写一个名称如serverName,表示serverName为节点名称

5、对于某个struct中,innerxml的tag标注,该struct的属性对应的数据为该struct相应的XMLName对应的xml下的所有内容,比如TestDesc对应的为server节点下的所有内容,Description对应的便是servers下的所有内容

 

由struct生成对应的xml,方法如下:

// struct2xmll project main.go
package main

import (
    "encoding/xml"
    "fmt"
    "os"
)

type Servers struct {
    XMLName xml.Name `xml:"servers"`
    Version string   `xml:"version,attr"`
    Svs     []server `xml:"server"`
}

type server struct {
    ServerName string `xml:"serverName"`
    ServerIP   string `xml:"serverIP"`
}

func main() {
    v := &Servers{Version: "1.0"}
    v.Svs = append(v.Svs, server{"Shanghai_VPN", "127.0.0.1"})
    v.Svs = append(v.Svs, server{"Beijing_VPN", "127.0.0.1"})
    output, err := xml.MarshalIndent(v, " ", " ")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    os.Stdout.Write([]byte(xml.Header))
    file, err := os.Create("servers.xml")
    file.Write([]byte(xml.Header))
    file.Write(output)
}

生成的xml文档:

 

json

将json字符串解析为struct:

// jsonparse project main.go
package main

import (
    "encoding/json"
    "fmt"
)

type Server struct {
    ServerName string `json:"serverName"`
    ServerIP   string `json:"serverIP"`
}

type Serversslice struct {
    Servers []Server `json:"servers"`
}

func main() {
    var s Serversslice
    str := `{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"192.168.20.132"}]}`
    json.Unmarshal([]byte(str), &s)
    fmt.Printf("%#v", s)
}

结果:

 

将一个struct解析为json如下:

package main

import (
    "encoding/json"
    "fmt"
)

type Server struct {
    serverName string `json:"serverName"`
    ServerIP   string `json:"serverIP"`
}

type ServersSlice struct {
    Servers []Server `json:"servers"`
    Desc    string   `json:"desc"`
}

func main() {
    servers := []Server{{serverName: "admin", ServerIP: "192.168.20.131"}, {serverName: "admin1", ServerIP: "192.168.20.132"}}
    desc := "描述部分"
    var ss ServersSlice
    ss.Desc = desc
    ss.Servers = servers
    js, _ := json.Marshal(ss)
    fmt.Printf("Json: %s", js)
}

结果:

 

本文转载自:http://www.cnblogs.com/vipzhou/p/5664255.html

共有 人打赏支持
c
粉丝 1
博文 108
码字总数 0
作品 0
西安
程序员
Golang 学习笔记(09)—— json和xml解析

本文为转载,原文:Golang 学习笔记(09)—— json和xml解析 Golang xml package 函数 Marshal Marshal函数返回v的XML编码。 Marshal处理数组或者切片时会序列化每一个元素。Marshal处理指针...

ChainZhang
01/03
0
0
Google Protocol Buffer 和 gRPC 简介

更多文章请访问独立博客 https://huangwenwei.com Protocol Buffer Protocol buffer 是谷歌推出的一种轻便高效的结构化数据存储格式,把结构化的数据序列化。常用以存储数据、作为网络通信的...

hww_面条酱
2017/10/18
0
0
Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang
2017/12/26
0
0
『简书API:Golang 处理 json 用法讲解(4):视频版』

大家好,我是谢伟,是一名程序员。 简书API:Jianshu-go 历史文章: 1.『简书API : jianshu 基于 golang (1)』 2.『简书API:jianshu 基于golang -- 用法介绍 (2)』 3. 『简书API:Goque...

谢小路
04/15
0
0
使用Go语言解析动态JSON格式

使用Go语言解析动态JSON格式 HP'S Memory2017-12-174 阅读 golang解析json动态格式 通常使用Golang 标准库可以方便的编码/解析JSON数据,但是前提需要定义struct数据结构。特别是解析未知结构...

HP'S Memory
2017/12/17
0
0
go提交json、获取json、解析json

猜你喜欢 Go语言的Json管理模式 golang json string remove field [笔记] Golang JSON go: json解析库go-simplejson使用 Golang 1.6: 数据库NULL值遇到JSON和模板(Template) beego下ie提示下...

d_watson
2016/05/24
43
0
go-web编程之处理json

摘抄自astaxie的开源书籍 build-web-application-with-golang 接下来的例子以下面XML描述的信息进行操作。 {"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverNam......

梁援-晋
2012/11/06
0
0
Go圣经-学习笔记之复合类型(三)

上一篇 Go圣经-学习笔记之复合类型(二) 下一篇 Go圣经-学习笔记之函数和错误处理 json数据的序列化和反序列化 json的全称是Javascript object notation, 中文全称:js对象表示法。在序列化和...

cdh0805010
2017/10/24
0
0
Golang 学习笔记(10)—— mysql操作

本文为转载,原文:Golang 学习笔记(10)—— mysql操作 Golang go-sql-driver/mysql go操作mysql的驱动包很多,这里讲解当下比较流行的go-sql-driver/mysql 安装 执行下面两个命令: 安装完...

ChainZhang
01/04
0
0
Python更快的解析JSON大文件

今天用python的simplejson库解析一个 >200MB 的JSON文件,发现一次decode/encode都得要 >10s,这个实在太慢了,有没有更快的库了? 先给出我的简单测试结果 json大小:245MB 测试方法:read文...

xjtuhit
2017/10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
31分钟前
12
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
33分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
47分钟前
6
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部