Skip to content

Commit d679019

Browse files
committed
Implement JSON to XML see #9
1 parent d2eebde commit d679019

1 file changed

Lines changed: 30 additions & 18 deletions

File tree

node.go

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io"
88
"io/ioutil"
99
"net/http"
10+
"reflect"
1011
"sort"
1112
)
1213

@@ -68,36 +69,47 @@ func (n *Node) InnerText() string {
6869
return buf.String()
6970
}
7071

71-
func outputXML(buf *bytes.Buffer, n *Node) {
72-
switch n.Type {
73-
case ElementNode:
74-
if n.Data == "" {
75-
buf.WriteString("<element>")
76-
} else {
77-
buf.WriteString("<" + n.Data + ">")
78-
}
79-
case TextNode:
80-
buf.WriteString(n.Data)
72+
func outputXML(buf *bytes.Buffer, n *Node, level int, skip bool) {
73+
level++
74+
if n.Type == TextNode {
75+
buf.WriteString(fmt.Sprintf("%v", n.value))
8176
return
8277
}
8378

84-
for child := n.FirstChild; child != nil; child = child.NextSibling {
85-
outputXML(buf, child)
86-
}
87-
if n.Data == "" {
88-
buf.WriteString("</element>")
79+
if v := reflect.ValueOf(n.value); v.Kind() == reflect.Slice {
80+
for child := n.FirstChild; child != nil; child = child.NextSibling {
81+
buf.WriteString("<" + n.Data + ">")
82+
outputXML(buf, child, level, true)
83+
buf.WriteString("</" + n.Data + ">")
84+
}
8985
} else {
90-
buf.WriteString("</" + n.Data + ">")
86+
d := n.Data
87+
if !skip {
88+
if d == "" {
89+
d = fmt.Sprintf("%v", n.value)
90+
}
91+
buf.WriteString("<" + d + ">")
92+
}
93+
94+
for child := n.FirstChild; child != nil; child = child.NextSibling {
95+
outputXML(buf, child, level, false)
96+
}
97+
if !skip {
98+
buf.WriteString("</" + d + ">")
99+
}
91100
}
92101
}
93102

94103
// OutputXML prints the XML string.
95104
func (n *Node) OutputXML() string {
96105
var buf bytes.Buffer
97-
buf.WriteString(`<?xml version="1.0"?>`)
106+
buf.WriteString(`<?xml version="1.0" encoding="utf-8"?>`)
107+
buf.WriteString("<root>")
108+
level := 0
98109
for n := n.FirstChild; n != nil; n = n.NextSibling {
99-
outputXML(&buf, n)
110+
outputXML(&buf, n, level, false)
100111
}
112+
buf.WriteString("</root>")
101113
return buf.String()
102114
}
103115

0 commit comments

Comments
 (0)