/
xls_to_xml_parser.go
109 lines (94 loc) · 2.35 KB
/
xls_to_xml_parser.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main
import (
"bytes"
"encoding/xml"
"log"
"os"
)
func makeStartXml(root *XlsObjNode, enc *xml.Encoder) {
valueList := root.value.([]*XlsObjNode)
token := xml.StartElement{xml.Name{"", root.key}, make([]xml.Attr, 0)}
for _, key := range valueList {
if key.nodeType == ATTR_TYPE {
attr := xml.Attr{xml.Name{"", key.key}, key.value.(string)}
token.Attr = append(token.Attr, attr)
}
}
enc.EncodeToken(token)
}
func makeEndXml(root *XlsObjNode, enc *xml.Encoder) {
enc.EncodeToken(xml.EndElement{xml.Name{"", root.key}})
}
func xlsToXml(root *XlsObjNode, enc *xml.Encoder) {
valueList := root.value.([]*XlsObjNode)
makeStartXml(root, enc)
for _, key := range valueList {
switch key.nodeType {
case VALUE_TYPE:
enc.EncodeToken(xml.StartElement{xml.Name{"", key.key}, make([]xml.Attr, 0)})
enc.EncodeToken(xml.CharData(key.value.(string)))
enc.EncodeToken(xml.EndElement{xml.Name{"", key.key}})
case HASH_TYPE:
hasId := false
valueList2 := key.value.([]*XlsObjNode)
for _, child := range valueList2 {
if child.isId {
hasId = true
break
}
}
if hasId {
for _, child := range valueList2 {
child.key = key.key
xlsToXml(child, enc)
}
} else {
// hasId := false
// valueList2 := key.value.([]*XlsObjNode)
// for _, child := range valueList2 {
// if child.isId {
// hasId = true
// break
// }
// }
// if hasId {
// for _, child := range valueList2 {
// child.key = key.key
// xlsToXml(key, enc)
// }
// } else {
xlsToXml(key, enc)
}
// }
case ARRAY_TYPE:
childList := key.value.([]*XlsObjNode)
for _, childKey := range childList {
if childKey.nodeType == VALUE_TYPE {
enc.EncodeToken(xml.StartElement{xml.Name{"", key.key}, make([]xml.Attr, 0)})
enc.EncodeToken(xml.CharData(childKey.value.(string)))
enc.EncodeToken(xml.EndElement{xml.Name{"", key.key}})
} else {
childKey.key = key.key
xlsToXml(childKey, enc)
}
}
}
}
makeEndXml(root, enc)
}
type XlsToXmlParser struct {
BaseXlsParser
}
func (this *XlsToXmlParser) SaveToFile(pkg, path string) {
var out bytes.Buffer
enc := xml.NewEncoder(&out)
enc.Indent("", "\t")
xlsToXml(this.root, enc)
enc.Flush()
fout, err := os.Create(path)
if nil != err {
log.Fatalln(err)
}
s := out.String()
fout.WriteString(s)
}