如何正确解析 xml
How to parse xml correctly
我想创建结构 = 每种类型的命令。
命令具有 xml - CommandResult 的公共部分。我创建了界面命令。我需要SomeCommand实现Command可以解析为xml,IsError必须在CommandResult中实现,其他功能必须由SomeCommand实现
代码:
type Command interface {
IsError() bool
Request(buf *bufio.Writer, params interface{}) error
...
}
// Result of request
type 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 command
type 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 too
XML:
<epp>
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<trID>
<svTRID>asd</svTRID>
</trID>
</response>
</epp>
预期结果:
a := SomeCommand
xml.NewDecoder(reader).Decode(&a)
// a.CommandResult.Code = 1000
// a.CommandResult.Message = 'Command completed successfully'
// a implements Command
我认为嵌入式结构中的路径应该是绝对的,因为所有 "parent's" 结构都是 "child" 的一部分。所以你的
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
与链接一起使用。有 issue on 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())
}
我想创建结构 = 每种类型的命令。
命令具有 xml - CommandResult 的公共部分。我创建了界面命令。我需要SomeCommand实现Command可以解析为xml,IsError必须在CommandResult中实现,其他功能必须由SomeCommand实现
代码:
type Command interface {
IsError() bool
Request(buf *bufio.Writer, params interface{}) error
...
}
// Result of request
type 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 command
type 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 too
XML:
<epp>
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<trID>
<svTRID>asd</svTRID>
</trID>
</response>
</epp>
预期结果:
a := SomeCommand
xml.NewDecoder(reader).Decode(&a)
// a.CommandResult.Code = 1000
// a.CommandResult.Message = 'Command completed successfully'
// a implements Command
我认为嵌入式结构中的路径应该是绝对的,因为所有 "parent's" 结构都是 "child" 的一部分。所以你的
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
与链接一起使用。有 issue on 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())
}