为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确解析xml

如何正确解析xml

Go
哔哔one 2021-12-07 18:29:50
我想创建 structs = 每种类型的命令。命令具有 xml 的公共部分 - CommandResult。我创建了接口命令。我需要SomeCommand实现Command并且可以解析为xml,而且CommandResult中必须实现IsError,其他功能必须通过SomeCommand来实现。代码:type Command interface {    IsError() bool    Request(buf *bufio.Writer, params interface{}) error    ...}// Result of requesttype CommandResult struct {    Code    int    `xml:"code,attr" json:"code"`    Message string `xml:"msg" json:"msg"`}// this Command's func is realized by CommandResult func (self CommandResult) IsError() bool {    return true}// some commandtype SomeCommand struct {    CommandResult // CommandResult `xml:"response>result" json:"result"`}// this Command's func is realized by SomeCommand func (self SomeCommand) Request(buf *bufio.Writer, params interface{}) error {    return nil}// other Command's functions are realized by CommandResult tooXML:<epp>  <response>    <result code="1000">      <msg>Command completed successfully</msg>    </result>    <trID>      <svTRID>asd</svTRID>    </trID>  </response></epp>预期结果:a := SomeCommandxml.NewDecoder(reader).Decode(&a)// a.CommandResult.Code = 1000// a.CommandResult.Message = 'Command completed successfully'// a implements Command
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我认为嵌入结构中的路径应该是绝对的,因为所有“父”结构都是“子”的一部分。所以你的


 type CommandResult struct {

     Code    int    `xml:"code,attr" json:"code"`

     Message string `xml:"msg" json:"msg"`

 }

应该更像


 type CommandResult struct {

     Code    int    `xml:"response>result>code,attr" json:"code"`

     Message string `xml:"response>result>msg" json:"msg"`

 }

但!我们正面临着 Go 的局限性。


您不能attr与链接一起使用。Github 上有问题,但看起来不在优先级列表中。因此,如果我正确理解您的CommandResult声明的最短版本将是:


type CommandResult struct {

    Result struct {

        Code    int    `xml:"code,attr" json:"code"`

        Message string `xml:"msg" json:"msg"`

    } `xml:"response>result" json:"response"`

}

不是一个真正的问题,但如果您决定转换Command回 XML 会很好地声明它的XMLName. 就像是


type CommandResult struct {

    XMLName xml.Name `xml:"epp"`

    Result  struct {

        Code    int    `xml:"code,attr" json:"code"`

        Message string `xml:"msg" json:"msg"`

    } `xml:"response>result" json:"response"`

}

因为没有它 XML 编码器会产生类似 <SomeCommand><response>...</response></SomeCommand>


使用完整示例更新


package main


import (

    "bufio"

    "encoding/xml"

    "log"

)


type Command interface {

    IsError() bool


    Request(buf *bufio.Writer, params interface{}) error

}


// Result of request

type CommandResult struct {

    XMLName xml.Name `xml:"epp"`

    Result  struct {

        Code    int    `xml:"code,attr" json:"code"`

        Message string `xml:"msg" json:"msg"`

    } `xml:"response>result" json:"response"`

}


// this Command's func is realized by CommandResult

func (self CommandResult) IsError() bool {

    return true

}


// some command

type SomeCommand struct {

    CommandResult

}


// this Command's func is realized by SomeCommand

func (self SomeCommand) Request(buf *bufio.Writer, params interface{}) error {

    return nil

}


type AnotherCommand struct {

    CommandResult

}


func (self AnotherCommand) Request(buf *bufio.Writer, params interface{}) error {

    return nil

}


func main() {

    var c Command


    c = SomeCommand{}

    log.Println(c.IsError())


    c = AnotherCommand{}

    log.Println(c.IsError())

}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信