首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析xml后输出为零

解析xml后输出为零
EN

Stack Overflow用户
提问于 2021-03-10 19:59:01
回答 1查看 39关注 0票数 1

我在Go中解析xml遇到了问题。

一个只有一个“游戏”的xml示例:

代码语言:javascript
复制
<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中获取游戏的切片。带有游戏和所有文件结构的代码:

代码语言:javascript
复制
package data

type 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"`
}

另一个文件:

代码语言:javascript
复制
package data

import (
    "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‘函数,并得到以下输出:

代码语言:javascript
复制
Successfully Opened xml
{[]}

我认为解析过程还可以,这是sctructs的问题所在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 20:27:44

ro结构中的RoGames的结构标记包含root,但似乎不需要这样做。如果您将其更改为game,则解析似乎做了正确的事情:

代码语言:javascript
复制
type ro struct {
    RoGames []roGame `xml:"game"`
}

因为您已经在game标记中了,所以不需要将它添加到roGame结构的每个字段中。

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

代码语言:javascript
复制
var ro ro
err = xml.Unmarshal(inBytes, &ro)
if err != nil {
    panic(err)
}

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

代码语言:javascript
复制
panic: strconv.ParseInt: parsing "z0046-54": invalid syntax

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

因此,如果我们改变这一点,我们将为您的roGame结构获得以下内容:

代码语言:javascript
复制
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"`
}

现在,以一种有用的格式the code outputs您的数据。你也可以使用像this这样的工具来生成你的结构,这使得它更容易并且不容易出错。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66564320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档