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

结果:

golang的xml、json解析的更多相关文章

  1. XML JSON解析--基本功能

    一,json的解析 json文件: {"code": "cn","cities":   [{"name": " ...

  2. UI学习笔记---第十六天XML JSON解析

    一.解析的基本概念 从事先规定好的格式中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据,数据方按照格式获取数据 常见解析方式XML解析JSON解析 二.XML:可扩展标记语言 XML ...

  3. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

  4. iOS-数据持久化基础-JSON与XML数据解析

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

  5. iOS开发笔记3:XML/JSON数据解析

    这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...

  6. Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

    1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...

  7. JSON解析和XML解析

    一. XML:用到一个开源解析类,GDataXMLNode(将其加入项目中),添加libxml2.dylib框架 经常用到的方法: 1.- (id)initWithXMLString:(NSStrin ...

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

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

  9. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

随机推荐

  1. VSM Import Cluster功能验证二(导入篇)

    三 vsm import cluster 3.1登录vsm web UI 登陆 VSM web UI,https://172.16.34.51/dashboard/vsm/,点击Cluster Man ...

  2. DIOCP (一) DIOCP常见问题。

    1,IOCP是什么? 答:IOCP是windows下的服务器技术,并不是所有windows都能使用IOCP,只能在支持IOCP的windows操作系统上使用. 2,DIOCP是什么? 答:DIOCP是 ...

  3. C语言 算平均数

    int main() { int number ; int sum = 0; int count = 0; do { scanf("%d", &number ); if( ...

  4. SFML从入门到放弃(0) 配置环境

    SFML从入门到放弃(0) 配置环境 恩..开始划水..学sfml的时候顺便做点笔记什么的.. 安装 在linux里面打开终端 然后输入 sudo apt-get install libsfml-de ...

  5. 10分钟教你用Python玩转微信之好友性别比例统计分析

    01 前言+效果展示 想必,微信对于大家来说,是再熟悉不过的了.那么,大家想不想探索一下微信上的各种奥秘呢?今天,我们一起来简单分析一下微信上的好友性别比例吧~废话不多说,开始干活. 结果如下: 02 ...

  6. [bzoj4445] [SCOI2015]小凸想跑步 (半平面交)

    题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小 用叉积来求: \(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积) \((p_p-i)\tim ...

  7. @functools.wrapes

    保证被装饰函数的__name__属性不变

  8. 1016 部分A+B (15 分)

    // 题目不难,感觉变量定义的有点儿多了#include <iostream> #include <cmath> using namespace std; int main() ...

  9. 2019年华南理工大学程序设计竞赛(春季赛) K Parco_Love_String(后缀自动机)找两个串的相同字串有多少

    https://ac.nowcoder.com/acm/contest/625/K 题意: 给出Q 个询问 i , 求 s[0..i-1] 与 s[i...len-1] 有多少相同的字串 分析: 给出 ...

  10. netsh命令操作ipsec

    IPsec就是IP安全筛选,本可以在本地安全策略中的窗口上进行操作添加,那么netsh也可以支持命令行操作这部分的内容. 我们的示例是禁止IP地址为192.168.1.10访问财务部某机3389端口 ...