我在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 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"`
}另一个文件:
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‘函数,并得到以下输出:
Successfully Opened xml
{[]}我认为解析过程还可以,这是sctructs的问题所在。
发布于 2021-03-10 20:27:44
ro结构中的RoGames的结构标记包含root,但似乎不需要这样做。如果您将其更改为game,则解析似乎做了正确的事情:
type ro struct {
RoGames []roGame `xml:"game"`
}因为您已经在game标记中了,所以不需要将它添加到roGame结构的每个字段中。
另一件要注意的事情是,您应该在解析时处理所有错误,因为使用上面的修复会出现新的错误。只有在调整解析器代码时才会注意到:
var ro ro
err = xml.Unmarshal(inBytes, &ro)
if err != nil {
panic(err)
}首先,这将输出以下内容:
panic: strconv.ParseInt: parsing "z0046-54": invalid syntax这是因为您的结构定义中的Id字段是一个int,但它的数据是z0046-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"`
}现在,以一种有用的格式the code outputs您的数据。你也可以使用像this这样的工具来生成你的结构,这使得它更容易并且不容易出错。
https://stackoverflow.com/questions/66564320
复制相似问题