func (aut Person) CreateXml(e *etree.Element) *etree.Element { a := e.CreateElement("author") a_ln := a.CreateElement("last-name") a_mn := a.CreateElement("middle-name") a_fn := a.CreateElement("first-name") a_ln.SetText(aut.Lname) a_mn.SetText(aut.Mname) a_fn.SetText(aut.Fname) return a }
// SetBuilderElementValue if it will change to struct from map if the future's // author is feeling a bothersome in this function. func SetBuilderElementValue(elm *etree.Element, data map[string]interface{}, basekey string) (*etree.Element, bool) { var child *etree.Element key := basekey ts, tk := spaceDecompose(elm.Tag) _, sk := spaceDecompose(elm.Space) if elm.Tag != "" && ts != "" && tk != "" { key = fmt.Sprintf("%s:%s", elm.Space, basekey) } else if sk != "" { key = fmt.Sprintf("%s:%s", sk, basekey) } if values, ok := data[basekey]; ok { switch value := values.(type) { case nil: default: child = elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case int: child = elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case string: child = elm.CreateElement(key) child.SetText(value) case float64, float32: child = elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case time.Time: child = elm.CreateElement(key) child.SetText(value.Format(time.RFC3339)) case bool: _ = elm.CreateElement(fmt.Sprintf("%s:%s", key, key)) case []int: for _, v := range value { child = elm.CreateElement(key) child.SetText(fmt.Sprint(v)) } case []string: for _, v := range value { child = elm.CreateElement(key) child.SetText(v) } case Attrs: val, attrs := value[0], value[1] child, _ = SetBuilderElementValue(elm, URL{basekey: val}, basekey) switch attr := attrs.(type) { case map[string]string: for k, v := range attr { child.CreateAttr(k, v) } // TODO: gotta remove below case Attr: for k, v := range attr { child.CreateAttr(k, v) } } case interface{}: var childkey string if sk == "" { childkey = fmt.Sprintf("%s:%s", key, key) } else { childkey = fmt.Sprint(key) } switch value := values.(type) { case []URL: for _, v := range value { child := elm.CreateElement(childkey) for ck := range v { SetBuilderElementValue(child, v, ck) } } case URL: child := elm.CreateElement(childkey) for ck := range value { SetBuilderElementValue(child, value, ck) } } } return child, true } return child, false }
// SetBuilderElementValue if it will change to struct from map if the future's // author is feeling a bothersome in this function. func SetBuilderElementValue(elm *etree.Element, data map[string]interface{}, basekey string) bool { key := basekey ts, tk := spaceDecompose(elm.Tag) _, sk := spaceDecompose(elm.Space) if elm.Tag != "" && ts != "" && tk != "" { key = fmt.Sprintf("%s:%s", elm.Space, basekey) } else if sk != "" { key = fmt.Sprintf("%s:%s", sk, basekey) } if values, ok := data[basekey]; ok { switch value := values.(type) { case nil: default: child := elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case int: child := elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case string: child := elm.CreateElement(key) child.SetText(value) case float64, float32: child := elm.CreateElement(key) child.SetText(fmt.Sprint(value)) case time.Time: child := elm.CreateElement(key) child.SetText(value.Format(time.RFC3339)) case bool: _ = elm.CreateElement(fmt.Sprintf("%s:%s", key, key)) case []int: for _, v := range value { child := elm.CreateElement(key) child.SetText(fmt.Sprint(v)) } case []string: for _, v := range value { child := elm.CreateElement(key) child.SetText(v) } case interface{}: var childkey string if sk == "" { childkey = fmt.Sprintf("%s:%s", key, key) } else { childkey = fmt.Sprint(key) } switch value := values.(type) { case []URL: for _, v := range value { child := elm.CreateElement(childkey) for ck := range v { SetBuilderElementValue(child, v, ck) } } case URL: child := elm.CreateElement(childkey) for ck := range value { SetBuilderElementValue(child, value, ck) } } } return true } return false }