求助:复杂xml 解析(golang)

tonforce 2017-04-25 05:47:46
<tBInfos>
<tBInfo phone="13488888888" xm="铭峰" hm="110781198303059417">
<flag desc="唯一标识">4028896666de74720190a455d37a7e81</flag>
<code desc="返回编码">3</code>
<message desc="结果">返回成功</message>
</tBInfo>
</tBInfos>


求助大牛!

在定义结构体的时候, 多次出错, 时间紧迫, 故求助各位大牛。
望不吝赐教!谢谢!
...全文
1384 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
casainurbania 2018-12-11
  • 打赏
  • 举报
回复
第三方库etree 可以动态解析xml,支持X-path路径搜索,和属性搜索
https://blog.csdn.net/weixin_39172380/article/details/84944307
不得闲 2017-08-10
  • 打赏
  • 举报
回复
之前写的一个反序列化Xml到map中的函数

func UnmarshalXml(xmlbody []byte, v map[string]interface{})error {
	var (
		t        xml.Token
		err      error
		curName  string
		pmapName string
		curValue string
		mapobj   map[string]interface{}
	)
	decoder := xml.NewDecoder(bytes.NewReader(xmlbody))
	mapStack := list.New()
	for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
		switch token := t.(type) {
		case xml.StartElement:
			var parentmap map[string]interface{}
			pmapName = curName
			curName = token.Name.Local
			ele := mapStack.Back()
			if ele != nil {
				parentmap = ele.Value.(map[string]interface{})
			} else {
				parentmap = v
			}
			mapobj = make(map[string]interface{})
			parentmap[curName] = mapobj
			if pmapName != "" {
				if mapvalue, ok := parentmap[pmapName]; ok {
					switch mapvalue.(type) {
					case map[string]interface{}:
					default:
						//删除值
						delete(parentmap, pmapName)
					}
				}
			}
			mapStack.PushBack(mapobj)
		case xml.CharData:
			if curName != "" {
				curValue = string([]byte(token))
				vmap := mapStack.Back().Value.(map[string]interface{})
				vmap[curName] = curValue
			} else {
				curValue = ""
			}
		case xml.EndElement:
			ele := mapStack.Back()
			mapobj := ele.Value.(map[string]interface{})
			mapStack.Remove(ele)
			if len(mapobj) == 1 {
				ele = mapStack.Back()
				if ele != nil {
					parentmap := ele.Value.(map[string]interface{})
					for k, v := range mapobj {
						parentmap[k] = v
					}
				}
			}
			curName = ""
		}
	}
	if err == io.EOF{
		err = nil
	}
	return err
}
Cynhard85 2017-04-27
  • 打赏
  • 举报
回复
go doc xml.Unmarshal

2,348

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧