2016-12-06 121 views
2

XML元素的異質名單我有一個這樣的XML文檔:解組圍棋

<val> 
<alpha β='γ'/> 
<α δ='ε'/> 
(a whole bunch of the above, in random order) 
</val> 
換句話說

,異質列表。我想使用Go encoding/xml軟件包對它進行解組。我怎樣才能做到這一點?

回答

2

您無法在Go中建模這樣的XML文檔,並且您無法解組爲interace{},所以我建議事件驅動的解析爲此。

此事件驅動解析意味着當您解析XML文檔(的標記)時,您會收到類似於「遇到的開始元素」或「遇到的結束元素」(包含當然元素的細節)等事件,以及這些事件控制你的程序流(分支和/或基於它們改變內部狀態)。

以下示例將向您顯示此原則。它不處理更復雜的XML,因爲我希望這個例子很短,但是這種技術可以用來解析任何XML文檔。

使用xml.NewDecoder()創建xml.Decoder,並通過反覆調用Decoder.Token()(在循環中)解析XML的內容。

type Entry struct { 
    Name string 
    Attr string 
    Value string 
} 

func main() { 
    decoder := xml.NewDecoder(strings.NewReader(src)) 

    entries := []Entry{} 
    for { 
     t, err := decoder.Token() 
     if err != nil { 
      if err != io.EOF { 
       fmt.Println(err) 
      } 
      break 
     } 
     if se, ok := t.(xml.StartElement); ok && len(se.Attr) > 0 { 
      entries = append(entries, Entry{ 
       Name: se.Name.Local, 
       Attr: se.Attr[0].Name.Local, 
       Value: se.Attr[0].Value, 
      }) 
     } 
    } 

    fmt.Printf("%+v\n", entries) 
} 

const src = `<val> 
<alpha β='γ'/> 
<α δ='ε'/> 
<x y='z'/> 
</val>` 

輸出(嘗試在Go Playground):

[{Name:alpha Attr:β Value:γ} {Name:α Attr:δ Value:ε} {Name:x Attr:y Value:z}] 
+0

這如何可能在將來有可能相關建議

<val>元素將在[]Entry類型的片收集,以防人們有興趣參與討論(儘管事件驅動解析可能仍然是更好的選擇):https://github.com/golang/go/issues/13504 –