@@ -29,13 +29,17 @@ func (j *xmlWriter) Write(value *model.Value) ([]byte, error) {
2929 }()
3030 writer .Indent ("" , " " )
3131
32- element , err := j .toElement (value )
32+ element , err := j .toElement ("root" , value )
3333 if err != nil {
3434 return nil , fmt .Errorf ("failed to convert to element: %w" , err )
3535 }
36-
37- if err := writer .Encode (element ); err != nil {
38- return nil , err
36+ for _ , c := range element .Children {
37+ if err := writer .Encode (c ); err != nil {
38+ return nil , err
39+ }
40+ if err := writer .EncodeToken (xml .CharData ("\n " )); err != nil {
41+ return nil , err
42+ }
3943 }
4044
4145 if err := writer .Flush (); err != nil {
@@ -48,7 +52,7 @@ func (j *xmlWriter) Write(value *model.Value) ([]byte, error) {
4852 return outBytes , nil
4953}
5054
51- func (j * xmlWriter ) toElement (value * model.Value ) (* xmlElement , error ) {
55+ func (j * xmlWriter ) toElement (key string , value * model.Value ) (* xmlElement , error ) {
5256 readProcessingInstructions := func () []* xmlProcessingInstruction {
5357 if piMeta , ok := value .MetadataValue ("xml_processing_instructions" ); ok && piMeta != nil {
5458 if pis , ok := piMeta .([]* xmlProcessingInstruction ); ok {
@@ -62,7 +66,7 @@ func (j *xmlWriter) toElement(value *model.Value) (*xmlElement, error) {
6266 case model .TypeString :
6367 strVal , err := valueToString (value )
6468 return & xmlElement {
65- Name : "root" ,
69+ Name : key ,
6670 Content : strVal ,
6771 ProcessingInstructions : readProcessingInstructions (),
6872 }, err
@@ -74,7 +78,7 @@ func (j *xmlWriter) toElement(value *model.Value) (*xmlElement, error) {
7478 }
7579
7680 el := & xmlElement {
77- Name : "root" ,
81+ Name : key ,
7882 ProcessingInstructions : readProcessingInstructions (),
7983 }
8084
@@ -99,27 +103,34 @@ func (j *xmlWriter) toElement(value *model.Value) (*xmlElement, error) {
99103 continue
100104 }
101105
102- childEl , err := j .toElement (kv .Value )
106+ childEl , err := j .toElement (kv .Key , kv . Value )
103107 if err != nil {
104108 return nil , fmt .Errorf ("failed to convert child element %q to element: %w" , kv .Key , err )
105109 }
106- childEl .Name = kv .Key
107- el .Children = append (el .Children , childEl )
110+ if childEl .useChildrenOnly {
111+ el .Children = append (el .Children , childEl .Children ... )
112+ } else {
113+ el .Children = append (el .Children , childEl )
114+ }
108115 }
109116
110117 return el , nil
111118 case model .TypeSlice :
112119 el := & xmlElement {
113120 Name : "root" ,
114121 ProcessingInstructions : readProcessingInstructions (),
122+ useChildrenOnly : true ,
115123 }
116124 if err := value .RangeSlice (func (i int , value * model.Value ) error {
117- childEl , err := j .toElement (value )
125+ childEl , err := j .toElement (key , value )
118126 if err != nil {
119127 return err
120128 }
121- childEl .Name = "item"
122- el .Children = append (el .Children , childEl )
129+ if childEl .useChildrenOnly {
130+ el .Children = append (el .Children , childEl .Children ... )
131+ } else {
132+ el .Children = append (el .Children , childEl )
133+ }
123134
124135 return nil
125136 }); err != nil {
@@ -181,21 +192,20 @@ func (e *xmlElement) MarshalXML(enc *xml.Encoder, start xml.StartElement) error
181192 }
182193 }
183194 start .Name = xml.Name {Local : e .Name }
184- if err := enc .EncodeToken (start ); err != nil {
185- return err
186- }
187195
188196 if len (e .Attrs ) > 0 {
189197 for _ , attr := range e .Attrs {
190- if err := enc . EncodeToken ( xml.Attr {
198+ start . Attr = append ( start . Attr , xml.Attr {
191199 Name : xml.Name {Local : attr .Name },
192200 Value : attr .Value ,
193- }); err != nil {
194- return err
195- }
201+ })
196202 }
197203 }
198204
205+ if err := enc .EncodeToken (start ); err != nil {
206+ return err
207+ }
208+
199209 if len (e .Content ) > 0 {
200210 if err := enc .EncodeToken (xml .CharData (e .Content )); err != nil {
201211 return err
0 commit comments