mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00: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
2 changed files with 49 additions and 0 deletions
|
|
@ -279,13 +279,26 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
|
||||||
vf := finfo.value(val)
|
vf := finfo.value(val)
|
||||||
switch finfo.flags & fMode {
|
switch finfo.flags & fMode {
|
||||||
case fCharData:
|
case fCharData:
|
||||||
|
var scratch [64]byte
|
||||||
switch vf.Kind() {
|
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:
|
case reflect.String:
|
||||||
Escape(p, []byte(vf.String()))
|
Escape(p, []byte(vf.String()))
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
if elem, ok := vf.Interface().([]byte); ok {
|
if elem, ok := vf.Interface().([]byte); ok {
|
||||||
Escape(p, elem)
|
Escape(p, elem)
|
||||||
}
|
}
|
||||||
|
case reflect.Struct:
|
||||||
|
if vf.Type() == timeType {
|
||||||
|
Escape(p, []byte(vf.Interface().(time.Time).Format(time.RFC3339Nano)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,36 @@ type Book struct {
|
||||||
Title string `xml:",chardata"`
|
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 {
|
type SecretAgent struct {
|
||||||
XMLName struct{} `xml:"agent"`
|
XMLName struct{} `xml:"agent"`
|
||||||
Handle string `xml:"handle,attr"`
|
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&friends")}, ExpectXML: `<domain>google.com&friends</domain>`},
|
||||||
{Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &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: &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: atomValue, ExpectXML: atomXml},
|
||||||
{
|
{
|
||||||
Value: &Ship{
|
Value: &Ship{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue