文档章节

go语言学习-xml 解析

solate
 solate
发布于 2016/08/01 16:00
字数 963
阅读 198
收藏 0

json xml 解析

xml encoding/xml 包

Xml 做为一种平台无关的数据交换和信息传递技术应用十分广泛。如在 WebService 中 使用 XML 将数据编码成 SOAP 消息。很多接口也使用 XML 来传递数据。

1.func (enc *Encoder) Encode(v interface{}) error可以把一个对像直接序列化到io.Writer对 像中。

2.func (d *Decoder) Decode(v interface{}) error 从 io.Reader 中,返序列化 xml

package main

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

type Student struct {
	Name string
	Age  int
}

func main() {
	f, err := os.Create("data.dat")
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()

	s := &Student{"张三", 19} //创建 encode 对像
	encoder := xml.NewEncoder(f)
	//将 s 序列化到文件中
	encoder.Encode(s)

	//重置文件指针到开始位置
	f.Seek(0, os.SEEK_SET)
	decoder := xml.NewDecoder(f)
	var s1 Student //从文件中反序列化成对像
	decoder.Decode(&s1)
	fmt.Println(s1)
}

//data.dat
//<Student><Name>张三</Name><Age>19</Age></Student>

3.func Marshal(v interface{}) ([]byte, error) 对象直接序列化成字符

package main

import (
	"encoding/xml"
	"fmt"
)

type Student struct {
	Name string
	Age  int
}

func main() {
	s := &Student{"张三", 19}
	result, err := xml.Marshal(s)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(result))
}

//<Student><Name>张三</Name><Age>19</Age></Student>

4.func Unmarshal(data []byte, v interface{}) error 将一个 xml 反序列化为对象 结构体中的字段必须是公有的,即大写字母开头的。如果要解析的 xml 是小的,可以 使用 tag 来指定 Struct 的字段与 xml 标记的对应关系

package main

import (
	"encoding/xml"
	"fmt"
)

type Student struct {
	XMLName xml.Name `xml:"student"`
	Name    string   `xml:"name"`
	Age     int      `xml:"age"`
}

func main() {
	str := `<?xml version="1.0" encoding="utf-8"?>
           <student>
<name>张三</name> <age>19</age> </student>`
	var s Student
	xml.Unmarshal([]byte(str), &s)
	fmt.Println(s)
}

  • 结构体的字段还可以跟 Xml 的子结点绑定,如 phones>phone
package main

import (
	"encoding/xml"
	"fmt"
)

type Student struct {
	XMLName xml.Name `xml:"student"`
	Name    string   `xml:"name,attr"`
	Age     int      `xml:"age,attr"`
	Phone   []string `xml:"phones>phone",`
}
type ABC string

func main() {
	str := `<?xml version="1.0" encoding="utf-8"?>
			<student name="张三" age="19">
			   <phones>
				 <phone>12345</phone>
				 <phone>67890</phone>
			   </phones>
			</student>`
	var s Student
	xml.Unmarshal([]byte(str), &s)
	fmt.Println(s)
}


// 如果 带命名空间 <data:student name="张三" age="19">
结果就为 {{data student} 张三 19 []} 

5.token方式,大文件快速

在上面这几种方法中 Token 解析是最快的。对于大文件解析,或对性能有要 求时,这种方法是最佳选择。

package main

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

type Student struct {
	Name string
	Age  int
}

func main() {
	str :=
	"<?xml version=\"1.0\" encoding=\"utf-8\"?><Student><Name>张三</Name><Age>19</Age></Student>"
	decoder := xml.NewDecoder(strings.NewReader(str))
	var strName string
	for {
		token, err := decoder.Token()
		if err != nil {
			break
		}
		switch t := token.(type) {
		case xml.StartElement:
			stelm := xml.StartElement(t)
			fmt.Println("Start ", stelm.Name.Local) // 如果带命名空间 stelm.Name.Space
			strName = stelm.Name.Local
		case xml.EndElement:
			endelem := xml.EndElement(t)
			fmt.Println("End ", endelem.Name.Local)
		case xml.CharData:
			data := xml.CharData(t)
			str := string(data)
			switch strName {
			case "Name":
				fmt.Println("姓名:", str)
			case "Age":
				fmt.Println("年龄:", str)
			default:
				fmt.Println("other:", str)
			}
		}
	}
}

xml to struct

将单层xml 属性,转换成struct属性

package main

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

func main() {

	str := `<Row SheetId="报告单ID" PatName="患者名称" Age="患者年龄" DeptName=" 科室名称" Sex="患者性别" SheetName="报告名称" SubName="子项目名称" CheckDate="检查日期" VerifyDocName="审核医生" PropDocName="申请医生"ResultStatus="结果状态" RepDocName="报告医生" ReportDate="报告日期"  SheetItemId="报告单ItemID" ItemName="明细项名称" ItemEnName="报告项英文名" Status="高低箭头(↑ ↓)" Indicator="-1:偏低  0:正常 1:偏高 2其他" Value="检查结果值" Unit="检查结果值单位" ValueRange="正常范围" ValueMin="参考最低值" ValueMax="参考最高值" />`

	ChangeXMLToStruct(str)
}

//xml 转换成一个Struct
func ChangeXMLToStruct(str string) {
	decoder := xml.NewDecoder(strings.NewReader(str))
	var strName string
	fmt.Println("strName----", strName)
	for {
		token, err := decoder.Token()
		if err != nil {
			break
		}
		switch t := token.(type) {
		case xml.StartElement:
			//stelm := xml.StartElement(t)
			//fmt.Println("Start ", stelm.Name.Local) // 如果带命名空间 stelm.Name.Space
			//strName = stelm.Name.Local
			//strName = stelm.Name.Space
			//
			//fmt.Println(t.Attr)
			fmt.Println("-------------start---------------")
			for _, attr := range t.Attr {
				formart := "%s  string  `xml:\"%s,attr\"` //%s"
				fmt.Println(fmt.Sprintf(formart, attr.Name.Local, attr.Name.Local, attr.Value))
			}

			fmt.Println("-------------end---------------")

		case xml.EndElement:
			endelem := xml.EndElement(t)
			fmt.Println("End ", endelem.Name.Local)
		case xml.CharData:
			//先不管

		}
	}
}

© 著作权归作者所有

solate
粉丝 8
博文 123
码字总数 107548
作品 0
成都
程序员
私信 提问
4个Java的常用工具,了解一下吧!

在现如今的互联网时代里,Java无疑是一种极为流行的开发语言,无论是程序界还是整个互联网行业势必带来很大的影响。不管是人才需求还是薪资水平上,Java的发展前景都是很乐观的。 关于Java的...

梦想远方_8e96
2018/06/15
0
0
Android json解析有关内容学习笔记

毋庸置疑,Json是当下最主流最受欢迎的数据交换格式,得益于json的简单易用,一直没有系统的学习有关json的知识,总是一知半解,所以想整理一下json相关的学习内容。文档中指出,json是一种轻...

长平狐
2013/04/25
987
0
Web 开发模板引擎--TagFeather

TagFeather 是一个让美工不用去学任何程序代码,只需要借助流行工具就能所见所得的预览的 Web 开发模板引擎。简单的讲,页面设计人员只需要按照程序员指定的 CSS Class 和 ID 就什么都不用管...

匿名
2010/03/01
1K
0
JSON学习总结

什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更易理解 * JSON 使用 JavaSc...

拷贝忍者卡卡习
2016/04/02
6
0
Golang学习笔记目录

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

ChainZhang
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rsync工具常用选项以及同步的两种方式

rsync -av /etc/passwd /tmp/1.txt #rsync的本机传输写法 rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt #rsync的远程传输rsync格式rsync [OPTION] … SRC ......

林怡丰
今天
3
0
GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
3
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
5
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
6
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部