2016-12-06 61 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 –