aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/xml
diff options
context:
space:
mode:
authorHajime Hoshi <hajimehoshi@gmail.com>2015-05-10 04:22:11 +0900
committerroger peppe <rogpeppe@gmail.com>2015-06-04 07:16:25 +0000
commit2db587c0297224b9c525da0ed452502a4d2e0345 (patch)
tree2b812f231a5fe28e85e5f8d7c6792a2925fc67a0 /src/encoding/xml
parent227fb116bede3b09ba7399303ebac36eec43ff8a (diff)
downloadgo-2db587c0297224b9c525da0ed452502a4d2e0345.tar.xz
encoding/xml: Reset the parent stack before printing a chardata or comment field in a struct
This CL resets the parent stack when printing a character or comment field struct. In the case of XML elements, the previous parents stack must be considered. However, charadata or comment fields can't be printed in other fields so it seems required to reset the parent stack each time a chardata or comment field is printed. Fixes #5072 Change-Id: I84f61c9bfce94133cd0c076c11211b9be5b4b1ac Reviewed-on: https://go-review.googlesource.com/9910 Reviewed-by: Nigel Tao <nigeltao@golang.org> Reviewed-by: roger peppe <rogpeppe@gmail.com>
Diffstat (limited to 'src/encoding/xml')
-rw-r--r--src/encoding/xml/marshal.go6
-rw-r--r--src/encoding/xml/marshal_test.go18
2 files changed, 24 insertions, 0 deletions
diff --git a/src/encoding/xml/marshal.go b/src/encoding/xml/marshal.go
index d0899c0fa6..63f8e2aa87 100644
--- a/src/encoding/xml/marshal.go
+++ b/src/encoding/xml/marshal.go
@@ -924,6 +924,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
switch finfo.flags & fMode {
case fCharData:
+ if err := s.setParents(&noField, reflect.Value{}); err != nil {
+ return err
+ }
if vf.CanInterface() && vf.Type().Implements(textMarshalerType) {
data, err := vf.Interface().(encoding.TextMarshaler).MarshalText()
if err != nil {
@@ -967,6 +970,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
continue
case fComment:
+ if err := s.setParents(&noField, reflect.Value{}); err != nil {
+ return err
+ }
k := vf.Kind()
if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) {
return fmt.Errorf("xml: bad type for comment field of %s", val.Type())
diff --git a/src/encoding/xml/marshal_test.go b/src/encoding/xml/marshal_test.go
index 5e9718c20c..394855782e 100644
--- a/src/encoding/xml/marshal_test.go
+++ b/src/encoding/xml/marshal_test.go
@@ -340,6 +340,16 @@ type OuterOuterStruct struct {
OuterStruct
}
+type NestedAndChardata struct {
+ AB []string `xml:"A>B"`
+ Chardata string `xml:",chardata"`
+}
+
+type NestedAndComment struct {
+ AB []string `xml:"A>B"`
+ Comment string `xml:",comment"`
+}
+
func ifaceptr(x interface{}) interface{} {
return &x
}
@@ -995,6 +1005,14 @@ var marshalTests = []struct {
ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}},
},
+ {
+ ExpectXML: `<NestedAndChardata><A><B></B><B></B></A>test</NestedAndChardata>`,
+ Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"},
+ },
+ {
+ ExpectXML: `<NestedAndComment><A><B></B><B></B></A><!--test--></NestedAndComment>`,
+ Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"},
+ },
}
func TestMarshal(t *testing.T) {