mirror of
https://github.com/golang/go
synced 2024-11-18 18:14:43 -07:00
xml: Support fields not of type []byte when marshaling ",chardata"
Fixes #4506. R=rsc, remyoudompheng CC=golang-dev https://golang.org/cl/7106045
This commit is contained in:
parent
92e3e15546
commit
14bd52db3f
@ -279,13 +279,26 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
|
||||
vf := finfo.value(val)
|
||||
switch finfo.flags & fMode {
|
||||
case fCharData:
|
||||
var scratch [64]byte
|
||||
switch vf.Kind() {
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10))
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||
Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10))
|
||||
case reflect.Float32, reflect.Float64:
|
||||
Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits()))
|
||||
case reflect.Bool:
|
||||
Escape(p, strconv.AppendBool(scratch[:0], vf.Bool()))
|
||||
case reflect.String:
|
||||
Escape(p, []byte(vf.String()))
|
||||
case reflect.Slice:
|
||||
if elem, ok := vf.Interface().([]byte); ok {
|
||||
Escape(p, elem)
|
||||
}
|
||||
case reflect.Struct:
|
||||
if vf.Type() == timeType {
|
||||
Escape(p, []byte(vf.Interface().(time.Time).Format(time.RFC3339Nano)))
|
||||
}
|
||||
}
|
||||
continue
|
||||
|
||||
|
@ -59,6 +59,36 @@ type Book struct {
|
||||
Title string `xml:",chardata"`
|
||||
}
|
||||
|
||||
type Event struct {
|
||||
XMLName struct{} `xml:"event"`
|
||||
Year int `xml:",chardata"`
|
||||
}
|
||||
|
||||
type Movie struct {
|
||||
XMLName struct{} `xml:"movie"`
|
||||
Length uint `xml:",chardata"`
|
||||
}
|
||||
|
||||
type Pi struct {
|
||||
XMLName struct{} `xml:"pi"`
|
||||
Approximation float32 `xml:",chardata"`
|
||||
}
|
||||
|
||||
type Universe struct {
|
||||
XMLName struct{} `xml:"universe"`
|
||||
Visible float64 `xml:",chardata"`
|
||||
}
|
||||
|
||||
type Particle struct {
|
||||
XMLName struct{} `xml:"particle"`
|
||||
HasMass bool `xml:",chardata"`
|
||||
}
|
||||
|
||||
type Departure struct {
|
||||
XMLName struct{} `xml:"departure"`
|
||||
When time.Time `xml:",chardata"`
|
||||
}
|
||||
|
||||
type SecretAgent struct {
|
||||
XMLName struct{} `xml:"agent"`
|
||||
Handle string `xml:"handle,attr"`
|
||||
@ -345,6 +375,12 @@ var marshalTests = []struct {
|
||||
{Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `<domain>google.com&friends</domain>`},
|
||||
{Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `<domain>google.com<!-- &friends --></domain>`},
|
||||
{Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `<book>Pride & Prejudice</book>`},
|
||||
{Value: &Event{Year: -3114}, ExpectXML: `<event>-3114</event>`},
|
||||
{Value: &Movie{Length: 13440}, ExpectXML: `<movie>13440</movie>`},
|
||||
{Value: &Pi{Approximation: 3.14159265}, ExpectXML: `<pi>3.1415927</pi>`},
|
||||
{Value: &Universe{Visible: 9.3e13}, ExpectXML: `<universe>9.3e+13</universe>`},
|
||||
{Value: &Particle{HasMass: true}, ExpectXML: `<particle>true</particle>`},
|
||||
{Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `<departure>2013-01-09T00:15:00-09:00</departure>`},
|
||||
{Value: atomValue, ExpectXML: atomXml},
|
||||
{
|
||||
Value: &Ship{
|
||||
|
Loading…
Reference in New Issue
Block a user