Commit 9f9d66d3 authored by Roger Peppe's avatar Roger Peppe Committed by roger peppe

encoding/xml: fix default namespace of tags

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/6927Reviewed-by: 's avatarNigel Tao <nigeltao@golang.org>
Reviewed-by: 's avatarDave Cheney <dave@cheney.net>
parent 44e90315
......@@ -640,6 +640,8 @@ var marshalTests = []struct {
`<x xmlns="space1">` +
`<c>c1</c>` +
`<d>d1</d>` +
`</x>` +
`<x>` +
`<e>e1</e>` +
`</x>` +
`</top>`,
......
......@@ -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] == "" {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment