-
Notifications
You must be signed in to change notification settings - Fork 0
/
bxml.go
64 lines (54 loc) · 1.49 KB
/
bxml.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package bxml
import (
"strings"
"github.com/beevik/etree"
)
type Element interface {
GetName() string
GetText() string
GetAttr() (map[string]string, map[string]string)
GetInnerElements() []Element
}
func AddAllVerbs(response *etree.Element, verbs []Element) {
for _, verb := range verbs {
verbEl := createElement(verb)
response.AddChild(verbEl)
}
}
func createElement(element Element) *etree.Element {
el := etree.NewElement(element.GetName())
optAttr, paramAttr := element.GetAttr()
addPropertyToElement(el, element.GetText(), optAttr, paramAttr)
// Loop through all Inner Elements
if len(element.GetInnerElements()) != 0 {
for _, innerElement := range element.GetInnerElements() {
child := createElement(innerElement)
el.AddChild(child)
}
}
return el
}
func CreateDocument() (*etree.Document, *etree.Element) {
doc := etree.NewDocument()
doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`)
element := doc.CreateElement("Response")
return doc, element
}
func ToXML(document *etree.Document) (string, error) {
return document.WriteToString()
}
func addPropertyToElement(treeElement *etree.Element, text string, optAttr map[string]string, paramAttr map[string]string) {
if text != "" {
treeElement.SetText(text)
}
for _, attr := range []map[string]string{paramAttr, optAttr} {
for k, v := range attr {
if v != "" {
treeElement.CreateAttr(formatAttrKey(k), v)
}
}
}
}
func formatAttrKey(s string) string {
return strings.ToLower(string(s[0])) + s[1:]
}