On Mon, Jul 24, 2017 at 07:44:33PM -0700,
emarti...@gmail.com wrote:
[...]
>>> So I'm trying to unmarshal an XML with namespaces in go but i just can't
>>> find the right parser to do so.
[...]
>> type Root struct {
>> XMLName struct{} `xml:"urn:MNResultsResults MNResultsResults"`
>> Cpcs []float64 `xml:"urn:MNResultsResults
>> ssResultSet>ssResult>cpc"`
[...]
>> const s = `<?xml version="1.0" encoding="utf-8"?>
>> <ls:MNResultsResults xmlns:ls="urn:MNResultsResults">
>> <ls:ssResultSet ls:firstResult="1" ls:numResults="2" ls:totalHits="2">
>> <ls:ssResult ls:id="1">
>> <ls:cpc>42.0</ls:cpc>
[...]
> Is there any reason to declare the namespace 2 times?
> At first we declare XMLName (which doesn't seem to be used)
No, it is used: please read carefully the documentation on the
encoding/xml.Unmarshal (run `go doc xml.Unmarshal` or see [1]).
To cite the unmarshaling rules from there:
| * If the XMLName field has an associated tag of the form
| "name" or "namespace-URL name", the XML element must have the
| given name (and, optionally, name space) or else Unmarshal
| returns an error.
So the "XMLName" of a field is special and is served (among other
purposes, if needed) to tell the decoder what's the name -- possibly
namespaced -- of the XML element which is to be represented by the
data type containing that field.
> and then we use urn:MNResultsResults again at CPC []
You're correct on this point: the second namespace is not needed.
Again, to cite the doc:
| * If the XML element contains a sub-element whose name matches
| the prefix of a tag formatted as "a" or "a>b>c", unmarshal
| will descend into the XML structure looking for elements with the
| given names, and will map the innermost elements to that struct
| field. A tag starting with ">" is equivalent to one starting
| with the field name followed by ">".
From this definition, it's not clear, whether the full (namespaced)
names of the elements are meant or local, or both are recognized --
that is, "XML-namespace name>Another-XML-namespace another-name" is
understood, too. I have assumed the latter, but I'm now not sure.
Seems to work both ways on playground, so I'd drop the NS from the tag of
the Cpc field.
1.
https://golang.org/pkg/encoding/xml/#Unmarshal