我有以下xml:
...
<solution>
<ContainerBlockElement>
<Paragraph>
<Paragraph>
Foo
</Paragraph>
<Paragraph>
bar
</Paragraph>
</Paragraph>
</ContainerBlockElement>
</solution>
...
我想提取内容,但问题是:服务器可以向我发送第二个结构:
...
<solution>
<ContainerBlockElement>
<Paragraph>
baz
</Paragraph>
</ContainerBlockElement>
</solution>
...
我尝试使用这个结构去解码,但它不起作用:
type Blah struct {
...
Solutions []string `xml:"solution>ContainerBlockElement>Paragraph"`
Solutions2Paragraph []string `xml:"solution>ContainerBlockElement>Paragraph>Paragraph"`
}
我该如何解码?
答案 0 :(得分:3)
对于不可预测的结构,反序列化为结构不起作用。相反,您最好使用xml.Decoder.Token
使用XML解析器的流模式按顺序解析元素并根据需要处理它们。
decoder := xml.NewDecoder(xmlFile)
solutions := make([]string,0,0)
for {
t, _ := decoder.Token()
if t == nil {
break
}
switch se := t.(type) {
case xml.StartElement:
if se.Name.Local == "Paragraph" {
// Get the next token after the Paragraph start element, which will be the tag contents
innerText,ok := decoder.Token().(xml.CharData)
if !ok {
continue
}
solutions = append(solutions, string(innerText))
}
}
}
此代码未经测试,但应提供一个不错的起点。