From 4556703498df124904a6549b9786726c29c438e0 Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Fri, 5 Jun 2020 12:08:54 -0300 Subject: [PATCH 1/7] add namespace to struct --- xsdgen/config.go | 13 +++++++++++++ xsdgen/xsdgen.go | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/xsdgen/config.go b/xsdgen/config.go index 4f22f212..02e2182e 100644 --- a/xsdgen/config.go +++ b/xsdgen/config.go @@ -40,6 +40,9 @@ type Config struct { // if populated, only types that are true in this map // will be selected. allowTypes map[xml.Name]bool + + //True for adding namespace to the struct + addNamespace bool } type typeTransform func(xsd.Schema, xsd.Type) xsd.Type @@ -76,6 +79,7 @@ var DefaultOptions = []Option{ HandleSOAPArrayType(), SOAPArrayAsSlice(), UseFieldNames(), + AddNamespace(false), } // The Namespaces option configures the code generation process @@ -344,6 +348,15 @@ func useFieldNames(s xsd.Schema, t xsd.Type) xsd.Type { return t } +// AddNamespace to the generated structs +func AddNamespace(addNamespace bool) Option { + return func(cfg *Config) Option { + prev := cfg.addNamespace + cfg.addNamespace = addNamespace + return AddNamespace(prev) + } +} + // ProcessTypes allows for users to make arbitrary changes to a type before // Go source code is generated. func ProcessTypes(fn func(xsd.Schema, xsd.Type) xsd.Type) Option { diff --git a/xsdgen/xsdgen.go b/xsdgen/xsdgen.go index 878b6f81..3146ce9a 100644 --- a/xsdgen/xsdgen.go +++ b/xsdgen/xsdgen.go @@ -519,6 +519,16 @@ func (cfg *Config) flatten1(t xsd.Type, push func(xsd.Type), depth int) xsd.Type panic(fmt.Errorf("unexpected %T(%s %s)", t, xsd.XMLName(t).Space, xsd.XMLName(t).Local)) } +func addNamespace(t *xsd.ComplexType) *xsd.ComplexType { + namespace := make([]xsd.Element, 1) + namespace[0].Name.Local = "XmlNS" + namespace[0].Name.Space = t.Elements[0].Name.Space + namespace[0].Type = xsd.String + namespace[0].Scope = t.Elements[0].Scope + t.Elements = append(namespace, t.Elements...) + return t +} + func (cfg *Config) genTypeSpec(t xsd.Type) (result []spec, err error) { var s []spec cfg.debugf("generating type spec for %q", xsd.XMLName(t).Local) @@ -527,6 +537,9 @@ func (cfg *Config) genTypeSpec(t xsd.Type) (result []spec, err error) { case *xsd.SimpleType: s, err = cfg.genSimpleType(t) case *xsd.ComplexType: + if cfg.addNamespace { + t = addNamespace(t) + } s, err = cfg.genComplexType(t) case xsd.Builtin: // pass @@ -682,6 +695,15 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { options = ",omitempty" } tag := fmt.Sprintf(`xml:"%s %s%s"`, el.Name.Space, el.Name.Local, options) + + if cfg.addNamespace { + prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") + tag = fmt.Sprintf(`xml:"%s:%s%s"`, prefixLocal[0], el.Name.Local, options) + } + if el.Name.Local == "XmlNS" { + prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") + tag = fmt.Sprintf(`xml:"xmlns:%s,attr,omitempty"`, prefixLocal[0]) + } base, err := cfg.expr(el.Type) if err != nil { return nil, fmt.Errorf("%s element %s: %v", t.Name.Local, el.Name.Local, err) From 1906b7d22abe53019bde28b5b12152873fc0ef76 Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Fri, 5 Jun 2020 12:25:52 -0300 Subject: [PATCH 2/7] add example namespace --- xsdgen/example_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/xsdgen/example_test.go b/xsdgen/example_test.go index bbd68952..757043fb 100644 --- a/xsdgen/example_test.go +++ b/xsdgen/example_test.go @@ -356,3 +356,43 @@ func ExampleUseFieldNames() { // } } + +func ExampleAddNamespace() { + doc := xsdfile(` + + + + + + + + + + + + `) + + var cfg xsdgen.Config + cfg.Option(xsdgen.AddNamespace(true)) + + out, err := cfg.GenSource(doc) + if err != nil { + log.Fatal(err) + } + fmt.Printf("%s\n", out) + + // Output: // Code generated by xsdgen.test. DO NOT EDIT. + // + // package ws + // + // type Book struct { + // XmlNS string `xml:"xmlns:tns,attr,omitempty"` + // Title string `xml:"tns:title"` + // Author string `xml:"tns:author"` + // } + + // type Library struct { + // XmlNS string `xml:"xmlns:tns,attr,omitempty"` + // Book Book `xml:"tns:book"` + // } +} From ef6a413f51394d3f94e46e1dedfcc5331046d7f8 Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Mon, 8 Jun 2020 14:18:13 -0300 Subject: [PATCH 3/7] se agrega funciones para namespace centralizado --- xsd/parse.go | 3 ++- xsdgen/config.go | 13 +++++++++++++ xsdgen/xsdgen.go | 31 +++++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/xsd/parse.go b/xsd/parse.go index 38553836..b35a635d 100644 --- a/xsd/parse.go +++ b/xsd/parse.go @@ -775,7 +775,8 @@ func parseElement(ns string, el *xmltree.Element) Element { doc = doc.append(parseAnnotation(el)) } }) - t, ok := e.Type.(linkedType); if ok { + t, ok := e.Type.(linkedType) + if ok { e.Name.Space = t.Space } e.Doc = string(doc) diff --git a/xsdgen/config.go b/xsdgen/config.go index 4f22f212..a54b3fa2 100644 --- a/xsdgen/config.go +++ b/xsdgen/config.go @@ -40,6 +40,9 @@ type Config struct { // if populated, only types that are true in this map // will be selected. allowTypes map[xml.Name]bool + + //For adding namespace to the struct + addNamespace bool } type typeTransform func(xsd.Schema, xsd.Type) xsd.Type @@ -76,6 +79,7 @@ var DefaultOptions = []Option{ HandleSOAPArrayType(), SOAPArrayAsSlice(), UseFieldNames(), + AddNamespace(false), } // The Namespaces option configures the code generation process @@ -409,6 +413,15 @@ func SOAPArrayAsSlice() Option { } } +// AddNamespace to the generated structs +func AddNamespace(addNamespace bool) Option { + return func(cfg *Config) Option { + prev := cfg.addNamespace + cfg.addNamespace = addNamespace + return AddNamespace(prev) + } +} + func (cfg *Config) filterFields(t *xsd.ComplexType) ([]xsd.Attribute, []xsd.Element) { var ( elements []xsd.Element diff --git a/xsdgen/xsdgen.go b/xsdgen/xsdgen.go index 878b6f81..ce2cfec4 100644 --- a/xsdgen/xsdgen.go +++ b/xsdgen/xsdgen.go @@ -322,14 +322,18 @@ func (cfg *Config) expandComplexTypes(types []xsd.Type) []xsd.Type { for _, attr := range c.Attributes { shadowedAttributes[attr.Name] = struct{}{} } + + elements := []xsd.Element{} for _, el := range b.Elements { if _, ok := shadowedElements[el.Name]; !ok { - c.Elements = append(c.Elements, el) + elements = append(elements, el) + } else { cfg.debugf("complexType %s: extended element %s is overrided", c.Name.Local, el.Name.Local) } } + c.Elements = append(elements, c.Elements...) for _, attr := range b.Attributes { if _, ok := shadowedAttributes[attr.Name]; !ok { c.Attributes = append(c.Attributes, attr) @@ -519,6 +523,16 @@ func (cfg *Config) flatten1(t xsd.Type, push func(xsd.Type), depth int) xsd.Type panic(fmt.Errorf("unexpected %T(%s %s)", t, xsd.XMLName(t).Space, xsd.XMLName(t).Local)) } +func addNamespace(t *xsd.ComplexType) *xsd.ComplexType { + namespace := make([]xsd.Element, 1) + namespace[0].Name.Local = "XmlNS" + namespace[0].Name.Space = t.Elements[0].Name.Space + namespace[0].Type = xsd.String + namespace[0].Scope = t.Elements[0].Scope + t.Elements = append(namespace, t.Elements...) + return t +} + func (cfg *Config) genTypeSpec(t xsd.Type) (result []spec, err error) { var s []spec cfg.debugf("generating type spec for %q", xsd.XMLName(t).Local) @@ -527,6 +541,9 @@ func (cfg *Config) genTypeSpec(t xsd.Type) (result []spec, err error) { case *xsd.SimpleType: s, err = cfg.genSimpleType(t) case *xsd.ComplexType: + if cfg.addNamespace { + t = addNamespace(t) + } s, err = cfg.genComplexType(t) case xsd.Builtin: // pass @@ -681,7 +698,17 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { if el.Nillable || el.Optional { options = ",omitempty" } - tag := fmt.Sprintf(`xml:"%s %s%s"`, el.Name.Space, el.Name.Local, options) + + tag := fmt.Sprintf(`xml:"%s%s"`, el.Name.Local, options) + if cfg.addNamespace { + prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") + tag = fmt.Sprintf(`xml:"%s:%s%s"`, prefixLocal[0], el.Name.Local, options) + } + if el.Name.Local == "XmlNS" { + prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") + tag = fmt.Sprintf(`xml:"xmlns:%s,attr,omitempty"`, prefixLocal[0]) + } + base, err := cfg.expr(el.Type) if err != nil { return nil, fmt.Errorf("%s element %s: %v", t.Name.Local, el.Name.Local, err) From 1818d22a8c386ff05630dc936b86651b38f6569b Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Mon, 8 Jun 2020 14:21:22 -0300 Subject: [PATCH 4/7] marshall --- xsdgen/xsdgen.go | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/xsdgen/xsdgen.go b/xsdgen/xsdgen.go index ce2cfec4..1297bb87 100644 --- a/xsdgen/xsdgen.go +++ b/xsdgen/xsdgen.go @@ -524,12 +524,14 @@ func (cfg *Config) flatten1(t xsd.Type, push func(xsd.Type), depth int) xsd.Type } func addNamespace(t *xsd.ComplexType) *xsd.ComplexType { - namespace := make([]xsd.Element, 1) - namespace[0].Name.Local = "XmlNS" - namespace[0].Name.Space = t.Elements[0].Name.Space - namespace[0].Type = xsd.String - namespace[0].Scope = t.Elements[0].Scope - t.Elements = append(namespace, t.Elements...) + if t.Elements[0].Name.Local != "XmlNS" { + namespace := make([]xsd.Element, 1) + namespace[0].Name.Local = "XmlNS" + namespace[0].Name.Space = t.Elements[0].Name.Space + namespace[0].Type = xsd.String + namespace[0].Scope = t.Elements[0].Scope + t.Elements = append(namespace, t.Elements...) + } return t } @@ -699,11 +701,13 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { options = ",omitempty" } - tag := fmt.Sprintf(`xml:"%s%s"`, el.Name.Local, options) + tag := fmt.Sprintf(`xml:"%s %s%s"`, el.Name.Space, el.Name.Local, options) + if cfg.addNamespace { prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") tag = fmt.Sprintf(`xml:"%s:%s%s"`, prefixLocal[0], el.Name.Local, options) } + if el.Name.Local == "XmlNS" { prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") tag = fmt.Sprintf(`xml:"xmlns:%s,attr,omitempty"`, prefixLocal[0]) @@ -802,7 +806,7 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { xsdType: t, helperTypes: helperTypes, } - if len(overrides) > 0 { + if len(overrides) > 0 || cfg.addNamespace { unmarshal, marshal, err := cfg.genComplexTypeMethods(t, overrides) if err != nil { return result, err @@ -821,12 +825,23 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { func (cfg *Config) genComplexTypeMethods(t *xsd.ComplexType, overrides []fieldOverride) (marshal, unmarshal *ast.FuncDecl, err error) { var data struct { - Overrides []fieldOverride - Type string + Overrides []fieldOverride + Type string + NamesSpaces []xml.Name } data.Overrides = overrides data.Type = cfg.public(t.Name) + nameSpace := t.Elements[0].Name.Space + for _, el := range t.Elements { + if el.Name.Space != nameSpace { + var namespace xml.Name + namespace.Space = el.Name.Space + namespace.Local = strings.Title(el.Name.Local) + data.NamesSpaces = append(data.NamesSpaces, namespace) + } + } + unmarshal, err = gen.Func("UnmarshalXML"). Receiver("t *"+data.Type). Args("d *xml.Decoder", "start xml.StartElement"). @@ -862,9 +877,6 @@ func (cfg *Config) genComplexTypeMethods(t *xsd.ComplexType, overrides []fieldOv nonDefaultOverrides = append(nonDefaultOverrides, v) } } - if len(nonDefaultOverrides) == 0 { - return nil, unmarshal, nil - } data.Overrides = nonDefaultOverrides marshal, err = gen.Func("MarshalXML"). @@ -880,10 +892,15 @@ func (cfg *Config) genComplexTypeMethods(t *xsd.ComplexType, overrides []fieldOv {{end -}} } layout.T = (*T)(t) + {{- range .Overrides}} layout.{{.FieldName}} = (*{{.ToType}})(&layout.T.{{.FieldName}}) {{end -}} + {{- range .NamesSpaces}} + layout.{{.Local}}.XmlNS = "{{.Space}}" + {{end -}} + // return e.EncodeElement(layout, start) `, data).Decl() return marshal, unmarshal, err From 58b7d55624c10b23b90092bfd0523cb3b245eb55 Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Mon, 8 Jun 2020 20:33:25 -0300 Subject: [PATCH 5/7] change names --- xsdgen/xsdgen.go | 51 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/xsdgen/xsdgen.go b/xsdgen/xsdgen.go index 1297bb87..d3e0bd09 100644 --- a/xsdgen/xsdgen.go +++ b/xsdgen/xsdgen.go @@ -523,16 +523,15 @@ func (cfg *Config) flatten1(t xsd.Type, push func(xsd.Type), depth int) xsd.Type panic(fmt.Errorf("unexpected %T(%s %s)", t, xsd.XMLName(t).Space, xsd.XMLName(t).Local)) } -func addNamespace(t *xsd.ComplexType) *xsd.ComplexType { - if t.Elements[0].Name.Local != "XmlNS" { +func addNamespace(t *xsd.ComplexType) { + if t.Elements[0].Name.Local != "XMLNs" { namespace := make([]xsd.Element, 1) - namespace[0].Name.Local = "XmlNS" + namespace[0].Name.Local = "XMLNs" namespace[0].Name.Space = t.Elements[0].Name.Space namespace[0].Type = xsd.String namespace[0].Scope = t.Elements[0].Scope t.Elements = append(namespace, t.Elements...) } - return t } func (cfg *Config) genTypeSpec(t xsd.Type) (result []spec, err error) { @@ -544,7 +543,7 @@ func (cfg *Config) genTypeSpec(t xsd.Type) (result []spec, err error) { s, err = cfg.genSimpleType(t) case *xsd.ComplexType: if cfg.addNamespace { - t = addNamespace(t) + addNamespace(t) } s, err = cfg.genComplexType(t) case xsd.Builtin: @@ -708,7 +707,7 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { tag = fmt.Sprintf(`xml:"%s:%s%s"`, prefixLocal[0], el.Name.Local, options) } - if el.Name.Local == "XmlNS" { + if el.Name.Local == "XMLNs" { prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") tag = fmt.Sprintf(`xml:"xmlns:%s,attr,omitempty"`, prefixLocal[0]) } @@ -810,14 +809,14 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { unmarshal, marshal, err := cfg.genComplexTypeMethods(t, overrides) if err != nil { return result, err - } else { - if unmarshal != nil { - s.methods = append(s.methods, unmarshal) - } - if marshal != nil { - s.methods = append(s.methods, marshal) - } } + if unmarshal != nil { + s.methods = append(s.methods, unmarshal) + } + if marshal != nil { + s.methods = append(s.methods, marshal) + } + } result = append(result, s) return result, nil @@ -825,20 +824,22 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { func (cfg *Config) genComplexTypeMethods(t *xsd.ComplexType, overrides []fieldOverride) (marshal, unmarshal *ast.FuncDecl, err error) { var data struct { - Overrides []fieldOverride - Type string - NamesSpaces []xml.Name + Overrides []fieldOverride + Type string + NameSpaces []xml.Name } data.Overrides = overrides data.Type = cfg.public(t.Name) - nameSpace := t.Elements[0].Name.Space - for _, el := range t.Elements { - if el.Name.Space != nameSpace { - var namespace xml.Name - namespace.Space = el.Name.Space - namespace.Local = strings.Title(el.Name.Local) - data.NamesSpaces = append(data.NamesSpaces, namespace) + if cfg.addNamespace { + nameSpace := t.Elements[0].Name.Space + for _, el := range t.Elements { + if el.Name.Space != nameSpace { + var namespace xml.Name + namespace.Space = el.Name.Space + namespace.Local = strings.Title(el.Name.Local) + data.NameSpaces = append(data.NameSpaces, namespace) + } } } @@ -897,8 +898,8 @@ func (cfg *Config) genComplexTypeMethods(t *xsd.ComplexType, overrides []fieldOv layout.{{.FieldName}} = (*{{.ToType}})(&layout.T.{{.FieldName}}) {{end -}} - {{- range .NamesSpaces}} - layout.{{.Local}}.XmlNS = "{{.Space}}" + {{- range .NameSpaces}} + layout.{{.Local}}.XMLNs = "{{.Space}}" {{end -}} // return e.EncodeElement(layout, start) From 3d4929e09150a2931bfd530c93aa3dd5ffab6b02 Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Mon, 8 Jun 2020 20:41:47 -0300 Subject: [PATCH 6/7] fix merge --- xsdgen/example_test.go | 2 +- xsdgen/xsdgen.go | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/xsdgen/example_test.go b/xsdgen/example_test.go index 757043fb..01c08819 100644 --- a/xsdgen/example_test.go +++ b/xsdgen/example_test.go @@ -386,7 +386,7 @@ func ExampleAddNamespace() { // package ws // // type Book struct { - // XmlNS string `xml:"xmlns:tns,attr,omitempty"` + // XMLNs string `xml:"xmlns:tns,attr,omitempty"` // Title string `xml:"tns:title"` // Author string `xml:"tns:author"` // } diff --git a/xsdgen/xsdgen.go b/xsdgen/xsdgen.go index 9a031a1a..d3e0bd09 100644 --- a/xsdgen/xsdgen.go +++ b/xsdgen/xsdgen.go @@ -706,19 +706,12 @@ func (cfg *Config) genComplexType(t *xsd.ComplexType) ([]spec, error) { prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") tag = fmt.Sprintf(`xml:"%s:%s%s"`, prefixLocal[0], el.Name.Local, options) } -<<<<<<< HEAD - if el.Name.Local == "XmlNS" { - prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") - tag = fmt.Sprintf(`xml:"xmlns:%s,attr,omitempty"`, prefixLocal[0]) - } -======= if el.Name.Local == "XMLNs" { prefixLocal := strings.Split(el.Scope.Prefix(el.Name), ":") tag = fmt.Sprintf(`xml:"xmlns:%s,attr,omitempty"`, prefixLocal[0]) } ->>>>>>> 58b7d55624c10b23b90092bfd0523cb3b245eb55 base, err := cfg.expr(el.Type) if err != nil { return nil, fmt.Errorf("%s element %s: %v", t.Name.Local, el.Name.Local, err) From 6167516311b2ab0207de83db25bebe5b3058f1dd Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Mon, 8 Jun 2020 20:52:10 -0300 Subject: [PATCH 7/7] fix repeated function --- xsdgen/config.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/xsdgen/config.go b/xsdgen/config.go index e1085bbb..c6d0e5ab 100644 --- a/xsdgen/config.go +++ b/xsdgen/config.go @@ -422,14 +422,6 @@ func SOAPArrayAsSlice() Option { } } -// AddNamespace to the generated structs -func AddNamespace(addNamespace bool) Option { - return func(cfg *Config) Option { - prev := cfg.addNamespace - cfg.addNamespace = addNamespace - return AddNamespace(prev) - } -} func (cfg *Config) filterFields(t *xsd.ComplexType) ([]xsd.Attribute, []xsd.Element) { var (