summaryrefslogtreecommitdiff
path: root/src/pkg/xml/read.go
diff options
context:
space:
mode:
authorKei Son <hey.calmdown@gmail.com>2009-12-11 10:37:48 -0800
committerKei Son <hey.calmdown@gmail.com>2009-12-11 10:37:48 -0800
commit4faa9da32a986b1c10ad8b02e6bde4e6f06552ff (patch)
tree3016eecdbaea6a8f70831cb6a56929843bcceaa8 /src/pkg/xml/read.go
parente584e6d2da734864fab7bbc340aa83636a4e5739 (diff)
downloadgolang-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.go19
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);