I have the following xml:
...
<solution>
<ContainerBlockElement>
<Paragraph>
<Paragraph>
Foo
</Paragraph>
<Paragraph>
bar
</Paragraph>
</Paragraph>
</ContainerBlockElement>
</solution>
...
I want to extract the content but the problem is: The server can send me the second structure:
...
<solution>
<ContainerBlockElement>
<Paragraph>
baz
</Paragraph>
</ContainerBlockElement>
</solution>
...
I've tried to use this struct in go to decode but it doesn't work:
type Blah struct {
...
Solutions []string `xml:"solution>ContainerBlockElement>Paragraph"`
Solutions2Paragraph []string `xml:"solution>ContainerBlockElement>Paragraph>Paragraph"`
}
How can I decode this?
With unpredictable structures, deserializing into a struct is not going to work. Instead, you'll be better off using the streaming mode of the XML parser using xml.Decoder.Token
to parse elements in order and handle them as necessary.
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))
}
}
}
This code is untested but should provide a decent starting point.