diff options
| author | Kei Son <hey.calmdown@gmail.com> | 2009-12-11 10:37:48 -0800 |
|---|---|---|
| committer | Kei Son <hey.calmdown@gmail.com> | 2009-12-11 10:37:48 -0800 |
| commit | 4faa9da32a986b1c10ad8b02e6bde4e6f06552ff (patch) | |
| tree | 3016eecdbaea6a8f70831cb6a56929843bcceaa8 /src/pkg/xml/read.go | |
| parent | e584e6d2da734864fab7bbc340aa83636a4e5739 (diff) | |
| download | golang-4faa9da32a986b1c10ad8b02e6bde4e6f06552ff.tar.gz | |
bytes, strings: allow -1 in Map to mean "drop this character".
xml: drop invalid characters in attribute names
when constructing struct field names.
R=rsc
CC=r
http://codereview.appspot.com/157104
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/xml/read.go')
| -rw-r--r-- | src/pkg/xml/read.go | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/pkg/xml/read.go b/src/pkg/xml/read.go index 568578723..d8ee78a12 100644 --- a/src/pkg/xml/read.go +++ b/src/pkg/xml/read.go @@ -10,6 +10,7 @@ import ( "os"; "reflect"; "strings"; + "unicode"; ) // BUG(rsc): Mapping between XML elements and data structures is inherently flawed: @@ -144,6 +145,20 @@ func (p *Parser) Unmarshal(val interface{}, start *StartElement) os.Error { return p.unmarshal(v.Elem(), start); } +// fieldName strips invalid characters from an XML name +// to create a valid Go struct name. It also converts the +// name to lower case letters. +func fieldName(original string) string { + return strings.Map( + func(x int) int { + if unicode.IsDigit(x) || unicode.IsLetter(x) { + return unicode.ToLower(x) + } + return -1; + }, + original) +} + // Unmarshal a single XML element into val. func (p *Parser) unmarshal(val reflect.Value, start *StartElement) os.Error { // Find start element if we need it. @@ -269,7 +284,7 @@ func (p *Parser) unmarshal(val reflect.Value, start *StartElement) os.Error { val := ""; k := strings.ToLower(f.Name); for _, a := range start.Attr { - if strings.ToLower(a.Name.Local) == k { + if fieldName(a.Name.Local) == k { val = a.Value; break; } @@ -303,7 +318,7 @@ Loop: // Look up by tag name. // If that fails, fall back to mop-up field named "Any". if sv != nil { - k := strings.ToLower(t.Name.Local); + k := fieldName(t.Name.Local); any := -1; for i, n := 0, styp.NumField(); i < n; i++ { f := styp.Field(i); |
