diff --git a/src/pkg/encoding/xml/read.go b/src/pkg/encoding/xml/read.go index e97abec55a4490103fd6732a9781282dd2139445..9617150c8f1d1e871b20119b804fbca0fc0a8cd8 100644 --- a/src/pkg/encoding/xml/read.go +++ b/src/pkg/encoding/xml/read.go @@ -201,8 +201,8 @@ func (p *Parser) Unmarshal(val interface{}, start *StartElement) error { func fieldName(original string) string { var i int - //remove leading underscores - for i = 0; i < len(original) && original[i] == '_'; i++ { + //remove leading underscores, without exhausting all characters + for i = 0; i < len(original)-1 && original[i] == '_'; i++ { } return strings.Map( diff --git a/src/pkg/encoding/xml/read_test.go b/src/pkg/encoding/xml/read_test.go index d39c2d52a835cbbeb9adce7a09453a525c0ee0eb..fbb7fd5d2f276e2e75868921cc415ea956a3cb69 100644 --- a/src/pkg/encoding/xml/read_test.go +++ b/src/pkg/encoding/xml/read_test.go @@ -245,6 +245,9 @@ const pathTestString = ` <Value>C</Value> <Value>D</Value> </Item1> + <_> + <value>E</value> + </_> </items> <after>2</after> </result> @@ -279,11 +282,17 @@ type PathTestD struct { Before, After string } +type PathTestE struct { + Underline string `xml:"items>_>value"` + Before, After string +} + var pathTests = []interface{}{ &PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, &PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, &PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"}, &PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"}, + &PathTestE{Underline: "E", Before: "1", After: "2"}, } func TestUnmarshalPaths(t *testing.T) {