diff --git a/parser.go b/parser.go index 0c6ffb2..f0080fa 100644 --- a/parser.go +++ b/parser.go @@ -107,8 +107,8 @@ func (opt *Options) Parse() (err error) { switch element := token.(type) { case xml.StartElement: - opt.InElement = element.Name.Local + funcName := fmt.Sprintf("On%s", MakeFirstUpperCase(opt.InElement)) if err = callFuncByName(opt, funcName, []reflect.Value{reflect.ValueOf(element), reflect.ValueOf(opt.ProtoTree)}); err != nil { return diff --git a/xmlElement.go b/xmlElement.go index 6157332..3ef1dae 100644 --- a/xmlElement.go +++ b/xmlElement.go @@ -27,6 +27,7 @@ func (opt *Options) OnElement(ele xml.StartElement, protoTree []interface{}) (er if attr.Name.Local == "name" { e.Name = attr.Value + // fmt.Println(e, protoTree) } if attr.Name.Local == "type" { e.Type, err = opt.GetValueType(attr.Value, protoTree) diff --git a/xmlExtension.go b/xmlExtension.go index 4e3803d..1445ae0 100644 --- a/xmlExtension.go +++ b/xmlExtension.go @@ -38,11 +38,11 @@ func (opt *Options) OnExtension(ele xml.StartElement, protoTree []interface{}) ( // EndExtension handles parsing event on the extension end elements. func (opt *Options) EndExtension(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.Attribute.Len() > 0 && opt.SimpleType.Peek() != nil { - opt.Attribute.Peek().(*Attribute).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree) + opt.Attribute.Peek().(*Attribute).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree) if err != nil { return } opt.CurrentEle = "" } return -} \ No newline at end of file +} diff --git a/xmlFractionDigits.go b/xmlFractionDigits.go index 6771f5e..305af0d 100644 --- a/xmlFractionDigits.go +++ b/xmlFractionDigits.go @@ -16,7 +16,7 @@ import "encoding/xml" // than zero. func (opt *Options) EndFractionDigits(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlLength.go b/xmlLength.go index 57dd438..d1e92d7 100644 --- a/xmlLength.go +++ b/xmlLength.go @@ -15,7 +15,7 @@ import "encoding/xml" // equal to or greater than zero. func (opt *Options) EndLength(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlMaxExclusive.go b/xmlMaxExclusive.go index d2f7a08..b5f4c68 100644 --- a/xmlMaxExclusive.go +++ b/xmlMaxExclusive.go @@ -15,7 +15,7 @@ import "encoding/xml" // be less than this value). func (opt *Options) EndMaxExclusive(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlMaxInclusive.go b/xmlMaxInclusive.go index 9a588b0..0854f1c 100644 --- a/xmlMaxInclusive.go +++ b/xmlMaxInclusive.go @@ -15,7 +15,7 @@ import "encoding/xml" // be less than or equal to this value). func (opt *Options) EndMaxInclusive(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlMaxLength.go b/xmlMaxLength.go index c92c0e3..1b0637f 100644 --- a/xmlMaxLength.go +++ b/xmlMaxLength.go @@ -15,7 +15,7 @@ import "encoding/xml" // equal to or greater than zero. func (opt *Options) EndMaxLength(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlMinExclusive.go b/xmlMinExclusive.go index ab3464e..2207b9d 100644 --- a/xmlMinExclusive.go +++ b/xmlMinExclusive.go @@ -15,7 +15,7 @@ import "encoding/xml" // be greater than this value). func (opt *Options) EndMinExclusive(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlMinInclusive.go b/xmlMinInclusive.go index 6a51c76..197cbfc 100644 --- a/xmlMinInclusive.go +++ b/xmlMinInclusive.go @@ -15,7 +15,7 @@ import "encoding/xml" // be greater than or equal to this value). func (opt *Options) EndMinInclusive(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlMinLength.go b/xmlMinLength.go index a1c2d17..9c66589 100644 --- a/xmlMinLength.go +++ b/xmlMinLength.go @@ -8,14 +8,16 @@ package xgen -import "encoding/xml" +import ( + "encoding/xml" +) // EndMinLength handles parsing event on the minLength end elements. MinLength // specifies the minimum number of characters or list items allowed. Must be // equal to or greater than zero. func (opt *Options) EndMinLength(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlPattern.go b/xmlPattern.go index 3b14a3f..57dd5a9 100644 --- a/xmlPattern.go +++ b/xmlPattern.go @@ -14,14 +14,14 @@ import "encoding/xml" // defines the exact sequence of characters that are acceptable. func (opt *Options) EndPattern(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.Attribute.Len() > 0 && opt.SimpleType.Peek() != nil { - opt.Attribute.Peek().(*Attribute).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree) + opt.Attribute.Peek().(*Attribute).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree) if err != nil { return } opt.CurrentEle = "" } if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlRestriction.go b/xmlRestriction.go index 1247eea..8957218 100644 --- a/xmlRestriction.go +++ b/xmlRestriction.go @@ -38,7 +38,7 @@ func (opt *Options) OnRestriction(ele xml.StartElement, protoTree []interface{}) // EndRestriction handles parsing event on the restriction end elements. func (opt *Options) EndRestriction(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.Attribute.Len() > 0 && opt.SimpleType.Peek() != nil { - opt.Attribute.Peek().(*Attribute).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree) + opt.Attribute.Peek().(*Attribute).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree) if err != nil { return } diff --git a/xmlSimpleType.go b/xmlSimpleType.go index 9d7a1ff..adaed9e 100644 --- a/xmlSimpleType.go +++ b/xmlSimpleType.go @@ -8,7 +8,9 @@ package xgen -import "encoding/xml" +import ( + "encoding/xml" +) // OnSimpleType handles parsing event on the simpleType start elements. The // simpleType element defines a simple type and specifies the constraints and @@ -31,18 +33,31 @@ func (opt *Options) OnSimpleType(ele xml.StartElement, protoTree []interface{}) // EndSimpleType handles parsing event on the simpleType end elements. func (opt *Options) EndSimpleType(ele xml.EndElement, protoTree []interface{}) (err error) { + if opt.SimpleType.Len() > 0 && opt.Attribute.Len() > 0 { opt.Attribute.Peek().(*Attribute).Type = opt.SimpleType.Pop().(*SimpleType).Base return } - if ele.Name.Local == opt.CurrentEle && opt.ComplexType.Len() == 1 { + + if opt.ComplexType.Len() == 1 { opt.ProtoTree = append(opt.ProtoTree, opt.ComplexType.Pop()) opt.CurrentEle = "" } - if ele.Name.Local == opt.CurrentEle && !opt.InUnion { + if !opt.InUnion { opt.ProtoTree = append(opt.ProtoTree, opt.SimpleType.Pop()) opt.CurrentEle = "" } + // if ele.Name.Local == opt.CurrentEle && opt.ComplexType.Len() == 1 { + // fmt.Println("THIS1") + // opt.ProtoTree = append(opt.ProtoTree, opt.ComplexType.Pop()) + // opt.CurrentEle = "" + // } + + // if ele.Name.Local == opt.CurrentEle && !opt.InUnion { + // fmt.Println("THIS2") + // opt.ProtoTree = append(opt.ProtoTree, opt.SimpleType.Pop()) + // opt.CurrentEle = "" + // } return } diff --git a/xmlTotalDigits.go b/xmlTotalDigits.go index 753d5d4..ca71ba1 100644 --- a/xmlTotalDigits.go +++ b/xmlTotalDigits.go @@ -15,7 +15,7 @@ import "encoding/xml" // than zero. func (opt *Options) EndTotalDigits(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = "" diff --git a/xmlWhiteSpace.go b/xmlWhiteSpace.go index 1a3b3d9..d04ad76 100644 --- a/xmlWhiteSpace.go +++ b/xmlWhiteSpace.go @@ -15,7 +15,7 @@ import "encoding/xml" // carriage returns) is handled. func (opt *Options) EndWhiteSpace(ele xml.EndElement, protoTree []interface{}) (err error) { if opt.SimpleType.Len() > 0 && opt.Element.Len() > 0 { - if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Pop().(*SimpleType).Base, opt.ProtoTree); err != nil { + if opt.Element.Peek().(*Element).Type, err = opt.GetValueType(opt.SimpleType.Peek().(*SimpleType).Base, opt.ProtoTree); err != nil { return } opt.CurrentEle = ""