You'll need to use an UnmarshalXML func for the params: // Param is a tag w/ any name type Param struct { Name string `xml:"-"` Type string `xml:"type,attr"` MinOccurs int `xml:"minOccurs,attr"` MaxOccurs int `xml:"maxOccurs,attr"` Description string `xml:"description"` }
// ParamList type for unmarhsal type ParamList []Param // UnmarshalXML for the win func (pl *ParamList) UnmarshalXML(d *xml.Decoder, s xml.StartElement) error { tk, err := d.Token() for err == nil { switch t := tk.(type) { case xml.StartElement: param := Param{Name: t.Name.Local} if err = d.DecodeElement(¶m, &t); err != nil { return err } *pl = append(*pl, param) } if tk, err = d.Token(); err == io.EOF { return nil } } return err } // TopLevel is of course top level type TopLevel struct { Description string `xml:"description"` Rights Rights `xml:"rights"` Method []Method `xml:"method"` } // Method has request type Method struct { Name string `xml:"name,attr"` Description string `xml:"description"` Rights []Right `xml:"rights"` Request Request `xml:"request"` Response Response `xml:"response"` } // Right whatever type Right struct { Right string `xml:"right"` } // Request like Response type Request struct { Params ParamList `xml:"params"` } // Response like Request type Response struct { Params ParamList `xml:"params"` } // Rights type Rights struct { PrivLevel string `xml:"privLevel"` } On Wednesday, October 18, 2017 at 11:50:45 AM UTC-4, Jeffrey Smith wrote: > > I have a lot of XML documents that have sections in that contain tags that > can be of any name but will contain type,minOccurs,maxOccurs and have a > description inside it. For instance name,description,definition and id > below. > > > > <?xml version="1.0" encoding="utf-8"?> > <topLevel name="insight"> > <description>description number1</description> > <rights> > <privLevel>user</privLevel> > </rights> > <method name="graphCreate"> > <description>graphCreate API</description> > <rights></rights> > <request> > <params> > <name type="xs:string" minOccurs="1" > > <description>A friendly name to identify the graph</description> > </name> > <description type="xs:string" minOccurs="1" > > <description>Detailed description of the graph</description> > </description> > <definition type="graphDefinition" minOccurs="1" maxOccurs="1"> > <description>Specify the graph definition. i.e how this graph > should be built.</description> > </definition> > </params> > </request> > <response> > <params> > <id type="xs:unsignedInt" minOccurs="1" > > <description>graph identifier.</description> > </id> > </params> > </response> > </method> > </topLevel> > > Whats the best way to parse this. So far I have but can't work out how to > dynamically generate the struct to stuff this into. Any suggestions? > > type topLevel struct { > Description string `xml:"description"` > Rights rights `xml:"rights"` > Method []method `xml:"method"` > } > > > type method struct { > Name string `xml:"name,attr"` > Description string `xml:"description"` > Rights []right `xml:"rights"` > } > > > type right struct { > Right string `xml:"right"` > } > > > type request struct { > } > > > type rights struct { > PrivLevel string `xml:"privLevel"` > } > > -- 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.