go基础:xml解析

go基础:xml解析,第1张

一、简介

xml是一种进行数据交换和信息传递的一种格式,在web后端开发使用非常普遍,下面介绍go语言解析xml的方法。

二、代码

1.将xml解析为对象

<Person>
    <FullName>Grace R. EmlinFullName>
    <Company>Example Inc.Company>
    <Email where="home">
        <Addr>[email protected]Addr>
    Email>
    <Email where='work'>
        <Addr>[email protected]Addr>
    Email>
    <Group>
        <Value>FriendsValue>
        <Value>SquashValue>
    Group>
    <City>Hanga RoaCity>
    <State>Easter IslandState>
Person>

使用xml的Unmarshal进行自动解析

import (
	"encoding/xml"
	"fmt"
)

type Email struct {
		Where string `xml:"where,attr"`
		Addr  string
	}
	type Address struct {
		City, State string
	}
	type Result struct {
		// XMLName xml.Name `xml:"Person"`
		Name   string `xml:"FullName"`
		Phone  string
		Email  []Email
		Groups []string `xml:"Group>Value"`
		Address
	}
	type Root struct {
		XMLName xml.Name `xml:"root"`
		Res     Result   `xml:"Person"`
	}
	v := Result{Name: "none", Phone: "none"}


	data := `
		
			Grace R. Emlin
			Example Inc.
			
				[email protected]
			
			
				[email protected]
			
			
				Friends
				Squash
			
			Hanga Roa
			Easter Island
		
	`
	err := xml.Unmarshal([]byte(data), &v)
	if err != nil {
		fmt.Printf("error: %v", err)
		return
	}
	// fmt.Printf("XMLName: %#v\n", v.XMLName)
	fmt.Printf("Name: %q\n", v.Name)
	fmt.Printf("Phone: %q\n", v.Phone)
	fmt.Printf("Email: %v\n", v.Email)
	fmt.Printf("Groups: %v\n", v.Groups)
	fmt.Printf("Address: %v\n", v.Address)

下面是unmarshal解析的解析规则(下面的规则是从golang的官方文档中翻译过来的):

1)如果该结构有一个类型为[]byte或string",innerxnl"的字段。Unmarshal收集该字段中元素内嵌套的原始xMI。其余的规则仍然适用。

2)如果该结构有一个类型为xml . name的名为XMLName的字段,Unnarshal记录该字段中的元素名。

3)如果XMLName字段有表单的关联标记"name" 或 “namespace-URL name”, 元素必须具有name(和 , 可选的 “name space”),否则Unnarshal返回错误。

4)如果XML元素具有一个属性,该属性的名字与struct结构体的字段名字匹配(这个字段的tag 包含",attr" 或者显示包含name “name,attr”),Unmarshal记录该字段中的属性值。

5)如果XML元素包含字符数据,该数据积累在第一个有标签“chardata”的struct字段中,该struct字段的类型可能为[]byte或string。如果没有这样的字段。字符数据被丢弃。

6)如果XML元素包含注释,它们会累积在第一个带有标签",comments"的struct字段中。struct字段的类型可以是[]byte或string。如果没有这样的字段,注释将被丢弃。

7)如果XML元素包含名称匹配的子元素标签format tag的前缀为“a”或“a>b>c”,unmarshal将进入XML结构查找具有给定名称的元素,并将最内层的元素映射到该struct字段。以“>”开头的标签相当于一个以字段名后跟“>”开头的标签。

8)如果XML元素包含一个子元素,该子元素的名称与struct字段的XMLName标签匹配,并且struct字段没有按照前面的规则显式的名称标签,unmarshal将该子元素映射到该struct字段

9)如果XML元素包含一个子元素,它的名字匹配字段中没有任何模式标记(",attr", ", chardata"等)。Unmarshal 解析子元素到该结构字段。

10)如果XML元素包含一个子元素,它不符合上面的任何规则,并且该结构有一个带",any"标签的字段unmarshal 匹配子元素到该结构字段”。

11)一个非指针匿名结构字段被当作它的值的字段是外部结构的一部分来处理。

12)带有“-”标签的struct字段永远不会被解编入。

2.将对象解析为xml,这个过程是上面过程的逆过程,不过很简单,不用担心

type Email struct {
		Where string `xml:"where,attr"`
		Addr  string
	}
	type Address struct {
		City, State string
	}
	type Result struct {
		// XMLName xml.Name `xml:"Person"`
		Name   string `xml:"FullName"`
		Phone  string
		Email  []Email
		Groups []string `xml:"Group>Value"`
		Address
	}
	type Root struct {
		XMLName xml.Name `xml:"root"`
		Res     Result   `xml:"Person"`
	}

	r := Root{
		Res: Result{
			Name:   "爱喝水的社长",
			Phone:  "18888888888",
			Email:  []Email{Email{Where: "c1", Addr: "[email protected]"}, Email{Where: "c2", Addr: "[email protected]"}},
			Groups: []string{"group1", "group2"},
			Address: Address{
				City:  "China",
				State: "aaa",
			},
		},
	}

	vbyte, err := xml.Marshal(r)
	if err != nil {
		fmt.Println("marshal err", err)
	}
	fmt.Printf("%v\n", string(vbyte))

上面代码的输出结果为:

爱喝水的社长[email protected]@126.comgroup1group2Chinaaaa

与1中的xml结构相同!

以上就是go的xml的解析方式!

相同的内容在下面的公众号中也同步更新,每天发布一些编程知识,有兴趣的朋友可以关注下,感谢大家支持!!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/996201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存