2015-08-20 65 views
1

我有以下XML “文件”:解析XML在Golang - 拆封

<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>

我试图用Golang解析这一点,已经写了下面迄今:

package main 
 
import (
 
\t "fmt" 
 
\t "encoding/xml" 
 
) 
 

 
type Participant struct { 
 
\t XMLName   xml.Name `xml:"participant"` 
 
\t participant_name string `xml:"participant_name"` 
 
\t contestantnum  int `xml:"contestantnum"` 
 
\t rotnum    int `xml:"rotnum"` 
 
\t visiting_home_draw string `xml:"visiting_home_draw"` 
 
} 
 

 
type Event struct { 
 
\t XMLName   xml.Name `xml:"event"` 
 
\t event_datetimeGMT string `xml:"event_datetimeGMT"` 
 
\t gamenumber  string `xml:"gamenumber"` 
 
\t sporttype   string `xml:"sporttype"` 
 
\t league   string `xml:"league"` 
 
\t IsLive   string `xml:"IsLive"` 
 
\t Participant  []Participant `xml:"participant"` 
 
} 
 

 
type Events struct { 
 
\t XMLName xml.Name `xml:"events"` 
 
\t Event []Event `xml:"event"` 
 
} 
 

 
type Pinnacle_Line_Feed struct { 
 
\t XMLName   xml.Name `xml:"pinnacle_line_feed"` 
 
\t PinnacleFeedTime string `xml:"PinnacleFeedTime"` 
 
\t lastContest  string `xml:"lastContest"` 
 
\t lastGame   string `xml:"lastGame"` 
 
\t Events   []Events `xml:"events"` 
 
}

坦率地说,我研究了很多关于Golang的深层嵌套xml解析,并且我还没有发现很多可以帮助解决此代码的Unmarshal部分。理想情况下,代码将返回类似于Python字典的东西,比如,

{event_datetimeGMT:2015年8月21日,gamenumber:483406220,...,visiting_home_draw: “主页”}

我是新到Golang,所以如果你发现这个问题的话,请和我一起露面。

编辑:

基于尼古拉斯的评论下面,我增加了以下内容。这运行没有错误,但产生一个空的结果。

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 { 
 
      return // or log.Panic(err.Error()) if in main 
 
     } 
 
}

回答

1

你可以这样说:

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 “文件” 是一个字符串。如果你从互联网上获得它(例如http响应的主体),resp.Body已经会满足一个Reader,所以你可以跳过第一行。如果你在操作系统上打开一个真实的文件,你也可以打开它作为一个阅读器,同样的事情。

编辑:两件事:

  • 可以嵌套结构,并放弃对简单和清晰的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 
} 
+0

谢谢Nicolas!我根据你的回答编辑了我的评论,看起来这会毫无问题地运行,但结果只是空的。 – amachure

+0

看起来我有点晚了,Jay Crumb是对的!大写首字母在你的结构中! –

1

您需要大写结构中的所有字段。 xml解码器需要输出这些字段才能正常工作。去操场here