]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: fix default namespace of tags
authorRoger Peppe <rogpeppe@gmail.com>
Fri, 6 Mar 2015 11:32:42 +0000 (11:32 +0000)
committerroger peppe <rogpeppe@gmail.com>
Mon, 9 Mar 2015 09:10:30 +0000 (09:10 +0000)
The struct XMLName sets the default namespace, but
that's not good enough for nested tags, because an
earlier tag can set the implicit parents of a subsequent
tag. This change makes sure that we always explicitly set the
namespace on a tag when possible.

See https://go-review.googlesource.com/#/c/5910/4/src/encoding/xml/marshal_test.go@628
for discussion.

Change-Id: If1afc536471c0be83e5dd80381b598476ea3f44d
Reviewed-on: https://go-review.googlesource.com/6927
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Reviewed-by: Dave Cheney <dave@cheney.net>
src/encoding/xml/marshal_test.go
src/encoding/xml/typeinfo.go

index 601bb30d03810ce21f10cc3bec510b18bfa8a7a9..8362421db7433f4861a7693133fba384a56baf58 100644 (file)
@@ -640,6 +640,8 @@ var marshalTests = []struct {
                        `<x xmlns="space1">` +
                        `<c>c1</c>` +
                        `<d>d1</d>` +
+                       `</x>` +
+                       `<x>` +
                        `<e>e1</e>` +
                        `</x>` +
                        `</top>`,
index 22248d20a6d669e348c93f7d4b5feb558eee8e6d..c9a6421f2806b65569467d715906742884db4511 100644 (file)
@@ -194,6 +194,14 @@ func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, erro
                return finfo, nil
        }
 
+       if finfo.xmlns == "" && finfo.flags&fAttr == 0 {
+               // If it's an element no namespace specified, get the default
+               // from the XMLName of enclosing struct if possible.
+               if xmlname := lookupXMLName(typ); xmlname != nil {
+                       finfo.xmlns = xmlname.xmlns
+               }
+       }
+
        // Prepare field name and parents.
        parents := strings.Split(tag, ">")
        if parents[0] == "" {