golang的xml、json解析

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

结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

SniffAir:无线渗透测试框架

SniffAir是一个开源的无线安全框架,可帮助你轻松解析被动收集的无线数据并发起复杂的无线渗透测试。此外,它还可以处理大型的或多个pcap文件,执行交叉检查和...

1002
来自专栏向治洪

android PakageManagerService启动流程分析

PakageManagerService的启动流程图 ? 1.PakageManagerService概述 PakageManagerService是andro...

53310
来自专栏前端人人

React项目配置7(ES7的Async/Await的使用)

本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React项目配置1(如何管理项目公共js方法)---...

4895
来自专栏iOSDevLog

Plugin with id 'com.android.application' not found.

57714
来自专栏GIS讲堂

Highcharts导出图片

Highcharts是在做项目涉及到统计图的时候大家的首选,同时也会用到highcharts的export功能,将统计图导出为图片,刚好,最近也遇到了这样的事情...

5862
来自专栏信安之路

必知必会的安全工具

渗透测试中手工测试固然重要,但是测试工具也是必不可少的,一个好的工具可以让我们在渗透测试中事半功倍,俗话说,工欲善其事必先利其器,所以工具是很重要的,本文就主要...

1200
来自专栏嵌入式程序猿

那些年,我们追过的MCU复位

概述 在嵌入式系统中,复位(Reset)功能的应用非常广泛。复位是MCU工作开始的标志,MCU中所有的初始化工作都是在复位之后开始的。在实际应用中,我们也可以通...

3926
来自专栏我的博客

filter_input()详解,$_GET,$_POST,$_ENV,$_SERVER,$_SESSION,$_REQUEST

filter_input() 函数从脚本外部获取输入,并进行过滤。 本函数用于对来自非安全来源的变量进行验证,比如用户的输入。 本函数可从各种来源获取输入: I...

3465
来自专栏FreeBuf

EE 4GEE Mini本地提权漏洞(CVE-2018-14327)分析

我在前段时间从买了一个4G调制解调器。这是一个便携式4G WiFi移动宽带调制解调器。有一天,我查看了安装在电脑上的用于故障排除的服务,我看到了一个奇怪的服务,...

893
来自专栏杨建荣的学习笔记

ASM无法启动的问题分析(二)(r7笔记第88天)

第一篇的内容可以参考。ASM无法启动的问题分析(一),有不少的朋友给了一些建议,我也糅合了进来。一并感谢。 当然重启服务发现CSSD服务是Online,但是AS...

40210

扫码关注云+社区

领取腾讯云代金券