This commit is contained in:
Silke Hofstra 2025-06-20 15:36:51 -04:00 committed by GitHub
commit 3ddca43a58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 9 deletions

View File

@ -580,6 +580,15 @@ func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplat
// marshalAttr marshals an attribute with the given name and value, adding to start.Attr.
func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value) error {
// Dereference or skip nil pointer, interface values.
switch val.Kind() {
case reflect.Pointer, reflect.Interface:
if val.IsNil() {
return nil
}
val = val.Elem()
}
if val.CanInterface() && val.Type().Implements(marshalerAttrType) {
attr, err := val.Interface().(MarshalerAttr).MarshalXMLAttr(name)
if err != nil {
@ -626,15 +635,6 @@ func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value)
}
}
// Dereference or skip nil pointer, interface values.
switch val.Kind() {
case reflect.Pointer, reflect.Interface:
if val.IsNil() {
return nil
}
val = val.Elem()
}
// Walk slices.
if val.Kind() == reflect.Slice && val.Type().Elem().Kind() != reflect.Uint8 {
n := val.Len()

View File

@ -343,6 +343,10 @@ type MarshalerStruct struct {
Foo MyMarshalerAttrTest `xml:",attr"`
}
type IMarshalerStruct struct {
Foo interface{} `xml:",attr"`
}
type InnerStruct struct {
XMLName Name `xml:"testns outer"`
}
@ -1252,6 +1256,11 @@ var marshalTests = []struct {
ExpectXML: `<MarshalerStruct Foo="hello world"></MarshalerStruct>`,
Value: &MarshalerStruct{},
},
{
ExpectXML: `<IMarshalerStruct Foo="hello world"></IMarshalerStruct>`,
Value: &IMarshalerStruct{Foo: &MyMarshalerAttrTest{}},
MarshalOnly: true,
},
{
ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
Value: &OuterStruct{IntAttr: 10},