I need to parse an XML message that has a dynamic element, so I have used an element of type interface{}
to represent it in my Message struct.
Once I know the type of this dynamic element (at runtime) I initialise a message struct and then try to unmarshal the XML message. However, the contents of the dynamic element are not unmarshalled.
Here is a Go Playground with what I'm trying to achieve, with comments and the actual vs expected outputs: https://play.golang.org/p/eKVetUPmVI2
I tried several variations but can't get the unmarshalling to work as expected. Can anyone help me to understand why this behaviour and how to make it work? Thanks in advance.
Per the encoding/xml
package documentation:
If the XML element contains a sub-element that hasn't matched any of the above rules and the struct has a field with tag
",any"
, unmarshal maps the sub-element to that struct field.
One small update to your code makes it work as you expected:
Add the xml:",any"
tag to your Other
field definition.
To clean up the code, I would also remove the Any
type, you don't need it. You can change the Other
field definition to type interface{}
with tag xml:",any"
and accomplish the same thing.
Like so:
Other interface{} `xml:",any"`
Execute and see the "1000" captured.
I suggest updating your question to include your code directly to make it easier for people to find/search/read your question. Having the Go playground link as well is also useful so readers can quickly run/tweak/test the example.