gpt4 book ai didi

xml - 在 Go 中解码 XML 元素的异构列表

转载 作者:IT王子 更新时间:2023-10-29 01:41:50 24 4
gpt4 key购买 nike

我有一个这样的 XML 文档:

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

换句话说,一个异构列表。我想使用 Go encoding/xml 包对其进行解码。我该怎么做?

最佳答案

您无法在 Go 中为此类 XML 文档建模,也无法将其解码为 interace{} ,因此我建议对此进行事件驱动解析。

这种事件驱动的解析意味着当您解析 XML 文档(的标记)时,您会收到诸如“遇到开始元素”或“遇到结束元素”(当然还有元素的详细信息)之类的事件,并且这些事件控制程序的流程(分支和/或根据它们更改内部状态)。

下面的例子会告诉你这个原理。它不处理更复杂的 XML,因为我希望示例简短,但这种技术可用于解析任何 XML 文档。

创建一个 xml.Decoder 使用 xml.NewDecoder() , 并通过调用 Decoder.Token() 解析 XML 的内容反复(循环)。

<val>里面的元素将收集在 []Entry 类型的 slice 中:

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

关于xml - 在 Go 中解码 XML 元素的异构列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40987994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com