On Mon, Jul 24, 2017 at 07:44:33PM -0700, emartinez1...@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

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to