golang中xml的动态解析

wu_sphinx · · 65 次点击 · · 开始浏览    

今天在处理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过程。

本文来自:简书

感谢作者:wu_sphinx

查看原文:golang中xml的动态解析

65 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传