Skip to content

Commit

Permalink
encoding/xml: fix default namespace of tags
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
rogpeppe committed Mar 9, 2015
1 parent 44e9031 commit 9f9d66d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/encoding/xml/marshal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,8 @@ var marshalTests = []struct {
`<x xmlns="space1">` +
`<c>c1</c>` +
`<d>d1</d>` +
`</x>` +
`<x>` +
`<e>e1</e>` +
`</x>` +
`</top>`,
Expand Down
8 changes: 8 additions & 0 deletions src/encoding/xml/typeinfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -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] == "" {
Expand Down

0 comments on commit 9f9d66d

Please sign in to comment.