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

解析 xml 后零输出

解析 xml 后零输出

Go
喵喵时光机 2022-08-15 16:24:18
我在 Go 中解析 xml 时遇到问题。一个只有一个“游戏”的 xml 示例:<root><game><id>z0046-54</id><creation_time>1612988348</creation_time><black>aivo</black><white>gosha</white><turn_color>white</turn_color><board>h8 h9 i6 i8 j6 g9 j9 j7 k6 l6 g10 k7 l7 i10 i9 g6 j10 k11 j5 i4 k4 l3 h5 m5 j8 j11 g8 h7 i7 l5 k9 h6 m7 k12 l13 n6 m8 n9 m9</board><moves>h8 swap h9 i6 swap i8 swap j6 g9 j9 j7 k6 l6 g10 k7 l7 i10 i9 g6 j10 k11 j5 i4 k4 l3 h5 m5 j8 j11 g8 h7 i7 l5 k9 h6 m7 k12 l13 n6 m8 n9 m9</moves><alt5></alt5><proposition></proposition><proposer></proposer><status>finished</status><rule>taraguchi10</rule><time>7776000</time><tpm>2592000</tpm><start_time>1612988348</start_time><end_time>1613736768</end_time><winner>black</winner><winby>resign</winby><time_left_black>7536372</time_left_black><time_left_white>7267413</time_left_white><tid>z0046</tid></game></root>我想从 xml 获取游戏切片。带有游戏和所有文件结构的代码:package datatype ro struct {    RoGames []roGame `xml:"root>game"`}type roGame struct {    Id     int    `xml:"game>id"`    Black  string `xml:"game>black"`    White  string `xml:"game>white"`    Moves  string `xml:"game>moves"`    Alt5   string `xml:"game>alt_5"`    Rule   string `xml:"game>rule"`    Winner string `xml:"game>winner"`}另一个文件:package dataimport (    "encoding/xml"    "fmt"    "io/ioutil"    "os")func Xml() {    xmlFile, err := os.Open("data.xml")    if err != nil {        panic(err)    }    fmt.Println("Successfully Opened xml")    defer xmlFile.Close()    inBytes, err := ioutil.ReadAll(xmlFile)    if err != nil {        panic(err)    }    var ro ro    xml.Unmarshal(inBytes, &ro)    fmt.Println(ro)}我从主包调用“Xml”函数并获取此输出:Successfully Opened xml{[]}我认为解析过程是可以的,这是sctructs的问题。
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

结构中的 结构标记包含 ,但它似乎不需要。如果将其更改为 ,则解析似乎执行正确的操作:RoGamesrorootgame


type ro struct {

    RoGames []roGame `xml:"game"`

}

而且,由于您已经“进入”标记,因此无需将其添加到结构的每个字段。gameroGame


需要注意的另一件事是,您应该在解析时处理所有错误,因为使用上面的修复程序会发生新的错误。只有在调整解析器代码时才注意到它:


var ro ro

err = xml.Unmarshal(inBytes, &ro)

if err != nil {

    panic(err)

}

首先,这会输出以下内容:


panic: strconv.ParseInt: parsing "z0046-54": invalid syntax

这是因为结构定义中的字段是 一个 ,但它的数据是 ,它不能被解释为整数。Idintz0046-54


因此,如果我们改变它,我们将为您的结构获得以下结果:roGame


type roGame struct {

    Id     string `xml:"id"` // <-- Change is here

    Black  string `xml:"black"`

    White  string `xml:"white"`

    Moves  string `xml:"moves"`

    Alt5   string `xml:"alt_5"`

    Rule   string `xml:"rule"`

    Winner string `xml:"winner"`

}

现在,代码以有用的格式输出数据。您还可以使用这样的工具来生成结构,这样可以使其更容易并且不易出错。


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号