V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ryanking8215
V2EX  ›  程序员

golang 里 xml 的处理问题

  •  
  •   ryanking8215 ·
    ryanking8215 · 2014-03-01 15:10:16 +08:00 · 4774 次点击
    这是一个创建于 3702 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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来的,但是协议是"变化"的。
    2 条回复    1970-01-01 08:00:00 +08:00
    qiyi
        1
    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
        2
    ryanking8215  
    OP
       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吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5350 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:55 · PVG 16:55 · LAX 01:55 · JFK 04:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.