在Go中解组XML
我有以下xml“文件”:在Go中解组XML,xml,go,Xml,Go,我有以下xml“文件”: 1439954818555 34317132 218491030 2015-08-21 09:50 483406220 澳大利亚规则 AFL 不 山楂鹰 1251 1251 参观 阿德莱德港电力公司 1252 1252 家 您可以这样做: xmlReader := bytes.NewReader([]byte(your_xml_as_a_string_here)) yourPinnacleLineFeed := new(Pinnacle_Line_Feed) if
1439954818555
34317132
218491030
2015-08-21 09:50
483406220
澳大利亚规则
AFL
不
山楂鹰
1251
1251
参观
阿德莱德港电力公司
1252
1252
家
您可以这样做:
xmlReader := bytes.NewReader([]byte(your_xml_as_a_string_here))
yourPinnacleLineFeed := new(Pinnacle_Line_Feed)
if err := xml.NewDecoder(xmlReader).Decode(yourPinnacleLineFeed); err != nil {
return // or log.Panic(err.Error()) if in main
}
如果您的xml“文件”是字符串,则会出现这种情况。如果您是从internet上获得它(例如作为http响应的主体),resp.body已经可以满足读者的要求,因此您可以跳过第一行。如果你在操作系统上打开一个真实的文件,你也可以作为一个读卡器打开它,同样的事情
编辑:还有两件事:
- 为了简单明了,您可以嵌套结构并删除xml.Name字段
- 我还注意到,您忘记了结构中的参与者级别,导致没有参与者被取消签名
package main
import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"log"
)
type Pinnacle_Line_Feed struct {
PinnacleFeedTime string `xml:"PinnacleFeedTime"`
LastContest string `xml:"lastContest"`
LastGame string `xml:"lastGame"`
Events struct {
Event []struct {
Event_datetimeGMT string `xml:"event_datetimeGMT"`
Gamenumber string `xml:"gamenumber"`
Sporttype string `xml:"sporttype"`
League string `xml:"league"`
IsLive string `xml:"IsLive"`
Participants struct {
Participant []struct {
Participant_name string `xml:"participant_name"`
Contestantnum int `xml:"contestantnum"`
Rotnum int `xml:"rotnum"`
Visiting_home_draw string `xml:"visiting_home_draw"`
} `xml:"participant"`
} `xml:"participants"`
} `xml:"event"`
} `xml:"events"`
}
func main() {
pinny_xml := `
<pinnacle_line_feed>
<PinnacleFeedTime>1439954818555</PinnacleFeedTime>
<lastContest>34317132</lastContest>
<lastGame>218491030</lastGame>
<events>
<event>
<event_datetimeGMT>2015-08-21 09:50</event_datetimeGMT>
<gamenumber>483406220</gamenumber>
<sporttype>Aussie Rules</sporttype>
<league>AFL</league>
<IsLive>No</IsLive>
<participants>
<participant>
<participant_name>Hawthorn Hawks</participant_name>
<contestantnum>1251</contestantnum>
<rotnum>1251</rotnum>
<visiting_home_draw>Visiting</visiting_home_draw>
</participant>
<participant>
<participant_name>Port Adelaide Power</participant_name>
<contestantnum>1252</contestantnum>
<rotnum>1252</rotnum>
<visiting_home_draw>Home</visiting_home_draw>
</participant>
</participants>
<periods></periods>
</event>
</events>
</pinnacle_line_feed>
`
xmlReader := bytes.NewReader([]byte(pinny_xml))
yourPinnacleLineFeed := new(Pinnacle_Line_Feed)
if err := xml.NewDecoder(xmlReader).Decode(yourPinnacleLineFeed); err != nil {
log.Panic(err.Error())
}
printX(yourPinnacleLineFeed)
}
func printX(x interface{}) (err error) {
var xBytes []byte
xBytes, err = json.MarshalIndent(x, "", " ")
if err != nil {
return
}
fmt.Println(string(xBytes))
return
}
主程序包
进口(
“字节”
“编码/json”
“编码/xml”
“fmt”
“日志”
)
类型Pinnacle_Line_Feed结构{
PinnacleFeedTime字符串`xml:“PinnacleFeedTime”`
LastContest字符串`xml:“LastContest”`
LastGame字符串`xml:“LastGame”`
事件结构{
事件[]结构{
Event_datetimeGMT字符串`xml:“Event_datetimeGMT”`
Gamenumber字符串`xml:“Gamenumber”`
Sporttype字符串`xml:“Sporttype”`
League string`xml:“League”`
IsLive字符串`xml:“IsLive”`
参与者结构{
参与者[]结构{
参与者名称字符串`xml:“参与者名称”`
竞争者编号int`xml:“竞争者编号”`
Rotnum int`xml:“Rotnum”`
Visiting_home_draw字符串`xml:“Visiting_home_draw”`
}`xml:“参与者”`
}`xml:“参与者”`
}`xml:“事件”`
}`xml:“事件”`
}
func main(){
pinny_xml:=`
1439954818555
34317132
218491030
2015-08-21 09:50
483406220
澳大利亚规则
AFL
不
山楂鹰
1251
1251
参观
阿德莱德港电力公司
1252
1252
家
`
xmlReader:=bytes.NewReader([]字节(pinny_xml))
yourPinnacleLineFeed:=新建(PinnacleLineFeed)
如果错误:=xml.NewDecoder(xmlReader).Decode(yourPinnacleLineFeed);错误!=nil{
log.Panic(err.Error())
}
printX(您的PinnacleLineFeed)
}
func printX(x接口{})(错误){
变量xBytes[]字节
xBytes,err=json.marshallindent(x,“,”)
如果错误!=零{
返回
}
fmt.Println(字符串(xBytes))
返回
}
您需要将结构中的所有字段都大写。xml解码器需要导出字段才能正常工作。去操场。谢谢尼古拉斯!我根据你的回复编辑了我的评论,看起来这不会有任何问题,但结果是空的。看起来我有点晚了,杰伊·克拉姆是对的!结构中的大写首字母一直都是!