内容简介:今天在处理xml解析的时候,遇到一个动态处理的问题如下:输出如下
今天在处理xml解析的时候,遇到一个动态处理的问题如下:
type Example struct {
XMLName xml.Name `xml:"example"`
A string `xml:"a"`
Param interface{} `xml:"param"`
}
Param
的结构不固定,但是xml又没有json的 RawMessage
类似,要实现动态解析多有不便,但是还是有方法
package main
import (
"encoding/xml"
"fmt"
)
var rawXML1 = []byte(`<example>
<a>
hello
</a>
<param>
<x>1</x>
<y>2</y>
</param>
</example>`)
var rawXML2 = []byte(`<example>
<a>
hello
</a>
<param>
<m>3</m>
<n>4</n>
</param>
</example>`)
type Example struct {
XMLName xml.Name `xml:"example"`
A string `xml:"a"`
Param interface{} `xml:"param"`
}
type Pair1 struct {
X string `xml:"x"`
Y string `xml:"y"`
}
type Pair2 struct {
M int `xml:"m"`
N int `xml:"n"`
}
func main() {
// rawmessage with interface
{
var a Example
err := xml.Unmarshal(rawXML1, &a)
println(err == nil)
fmt.Printf("a is:%+v\n", a.Param)
}
// rawmessage with interface assignment value
{
var a Example
var p1 Pair1
a.Param = p1
err := xml.Unmarshal(rawXML1, &a)
println(err == nil)
fmt.Printf("a is:%+v\n", a.Param)
}
// rawmessage with interface assignment pointer
{
var a Example
var p1 Pair1
a.Param = &p1
err := xml.Unmarshal(rawXML1, &a)
println(err == nil)
fmt.Printf("a is:%+v\n", a.Param)
}
// rawmessage with interface assignment pointer
{
var a Example
var p2 Pair2
a.Param = &p2
err := xml.Unmarshal(rawXML2, &a)
println(err == nil)
fmt.Printf("a is:%+v", a.Param)
}
}
输出如下
true
a is:<nil>
true
a is:{X: Y:}
true
a is:&{X:1 Y:2}
true
a is:&{M:3 N:4}
可以通过指针赋值的方式让xml实现动态解析,这里必须传指针, 因为这里实现的是一个类似于 RawMessage
的Unmarshal过程。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Code Reading
Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99
This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
HTML 编码/解码
HTML 编码/解码