golang 里 xml 的处理问题

2014-03-01 15:10:16 +08:00
 ryanking8215
golang通过反射来marshal和unmarshal来处理xml。但涉及到具体应用,碰到个问题,例如有这样的协议定义:
<Msg>
<Type>Rsp</Type>
<SN>123456</SN>
<Rsp>
<!-- 这里是各个响应的协议内容 -->
</Rsp>
</Msg>

如果是请求的话,把上述的Rsp换成Req即可。
如果是unmarshal是好办的,定义一个Message struct,把Req和Rsp的struct放入其中,那么unmarshal后,可以根据不同的type,取不同的成员。
但是marshal就不同了,填了req的content,rsp也会被marshal出来。

有什么好办法吗?就是marshal和unmarshal是针对具体的struct来的,但是协议是"变化"的。
4913 次点击
所在节点    程序员
2 条回复
qiyi
2014-03-02 10:20:58 +08:00
godom?
https://code.google.com/p/godom/
支持golang 1.2的版本
https://bitbucket.org/qiyi/godom
简单使用:
golang 以 dom 方式解析 xml
http://isouth.org/archives/353.html
ryanking8215
2014-03-02 12:11:46 +08:00
谢谢,不过昨天晚上看纸牌屋的时候突然想到,可以使用pointer,再加上ommitempty的tag属性
如:
type Message struct {
Rsp *Response `xml:"rsp,ommitempty"`
Req *Resquest `xml:"req,ommitempty"`
}
这样在marshal的时候填所需要的成员即可。

按照我理解,在unmarshal的时候,由于是pointer,会碰到运行时错误,但是竟然也unmarshal正确了,xml包会自动帮我new struct吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/102420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX