|
7 | 7 | "io" |
8 | 8 | "io/ioutil" |
9 | 9 | "net/http" |
| 10 | + "reflect" |
10 | 11 | "sort" |
11 | 12 | ) |
12 | 13 |
|
@@ -68,36 +69,47 @@ func (n *Node) InnerText() string { |
68 | 69 | return buf.String() |
69 | 70 | } |
70 | 71 |
|
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)) |
81 | 76 | return |
82 | 77 | } |
83 | 78 |
|
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 | + } |
89 | 85 | } 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 | + } |
91 | 100 | } |
92 | 101 | } |
93 | 102 |
|
94 | 103 | // OutputXML prints the XML string. |
95 | 104 | func (n *Node) OutputXML() string { |
96 | 105 | 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 |
98 | 109 | for n := n.FirstChild; n != nil; n = n.NextSibling { |
99 | | - outputXML(&buf, n) |
| 110 | + outputXML(&buf, n, level, false) |
100 | 111 | } |
| 112 | + buf.WriteString("</root>") |
101 | 113 | return buf.String() |
102 | 114 | } |
103 | 115 |
|
|
0 commit comments