Source File
read.go
Belonging Package
encoding/xml
package xml
import (
)
func ( *Decoder) ( interface{}) error {
return .DecodeElement(, nil)
}
type UnmarshalError string
func ( UnmarshalError) () string { return string() }
type Unmarshaler interface {
UnmarshalXML(d *Decoder, start StartElement) error
}
type UnmarshalerAttr interface {
UnmarshalXMLAttr(attr Attr) error
}
.pushEOF()
.unmarshalDepth++
:= .UnmarshalXML(, *)
.unmarshalDepth--
if != nil {
.popEOF()
return
}
if !.popEOF() {
return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(), .Name.Local)
}
return nil
}
func ( *Decoder) ( encoding.TextUnmarshaler) error {
var []byte
:= 1
for > 0 {
, := .Token()
if != nil {
return
}
switch t := .(type) {
case CharData:
if == 1 {
= append(, ...)
}
case StartElement:
++
case EndElement:
--
}
}
return .UnmarshalText()
}
return .Interface().(UnmarshalerAttr).UnmarshalXMLAttr()
}
if .CanAddr() {
:= .Addr()
if .CanInterface() && .Type().Implements(unmarshalerAttrType) {
return .Interface().(UnmarshalerAttr).UnmarshalXMLAttr()
}
}
return .Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(.Value))
}
if .CanAddr() {
:= .Addr()
if .CanInterface() && .Type().Implements(textUnmarshalerType) {
return .Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(.Value))
}
}
if := .(.Index(), ); != nil {
.SetLen()
return
}
return nil
}
if .Type() == attrType {
.Set(reflect.ValueOf())
return nil
}
return copyValue(, []byte(.Value))
}
var (
attrType = reflect.TypeOf(Attr{})
unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem()
unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem()
textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
)
if == nil {
for {
, := .Token()
if != nil {
return
}
if , := .(StartElement); {
= &
break
}
}
}
return .unmarshalInterface(.Interface().(Unmarshaler), )
}
if .CanAddr() {
:= .Addr()
if .CanInterface() && .Type().Implements(unmarshalerType) {
return .unmarshalInterface(.Interface().(Unmarshaler), )
}
}
if .CanInterface() && .Type().Implements(textUnmarshalerType) {
return .unmarshalTextInterface(.Interface().(encoding.TextUnmarshaler))
}
if .CanAddr() {
:= .Addr()
if .CanInterface() && .Type().Implements(textUnmarshalerType) {
return .unmarshalTextInterface(.Interface().(encoding.TextUnmarshaler))
}
}
var (
[]byte
reflect.Value
[]byte
reflect.Value
reflect.Value
int
[]byte
reflect.Value
reflect.Value
*typeInfo
error
)
switch := ; .Kind() {
default:
return errors.New("unknown type " + .Type().String())
=
break
}
if := .(.Index(), ); != nil {
.SetLen()
return
}
return nil
case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String:
=
case reflect.Struct:
:= .Type()
if == nameType {
.Set(reflect.ValueOf(.Name))
break
}
=
, = getTypeInfo()
if != nil {
return
}
if .xmlname != nil {
:= .xmlname
if .name != "" && .name != .Name.Local {
return UnmarshalError("expected element type <" + .name + "> but have <" + .Name.Local + ">")
}
if .xmlns != "" && .xmlns != .Name.Space {
:= "expected element <" + .name + "> in name space " + .xmlns + " but have "
if .Name.Space == "" {
+= "no name space"
} else {
+= .Name.Space
}
return UnmarshalError()
}
:= .value(, initNilPointers)
if , := .Interface().(Name); {
.Set(reflect.ValueOf(.Name))
}
}
for , := range .Attr {
:= false
:= -1
for := range .fields {
:= &.fields[]
switch .flags & fMode {
case fAttr:
:= .value(, initNilPointers)
if .Name.Local == .name && (.xmlns == "" || .xmlns == .Name.Space) {
if := .unmarshalAttr(, ); != nil {
return
}
= true
}
case fAny | fAttr:
if == -1 {
=
}
}
}
if ! && >= 0 {
:= &.fields[]
:= .value(, initNilPointers)
if := .unmarshalAttr(, ); != nil {
return
}
}
}
for := range .fields {
:= &.fields[]
switch .flags & fMode {
case fCDATA, fCharData:
if !.IsValid() {
= .value(, initNilPointers)
}
case fComment:
if !.IsValid() {
= .value(, initNilPointers)
}
case fAny, fAny | fElement:
if !.IsValid() {
= .value(, initNilPointers)
}
case fInnerXML:
if !.IsValid() {
= .value(, initNilPointers)
if .saved == nil {
= 0
.saved = new(bytes.Buffer)
} else {
= .savedOffset()
}
}
}
}
}
:
for {
var int
if .IsValid() {
= .savedOffset()
}
, := .Token()
if != nil {
return
}
switch t := .(type) {
case StartElement:
:= false
if .IsValid() {
, = .unmarshalPath(, , nil, &)
if != nil {
return
}
if ! && .IsValid() {
= true
if := .(, &); != nil {
return
}
}
}
if ! {
if := .Skip(); != nil {
return
}
}
case EndElement:
if .IsValid() {
= .saved.Bytes()[:]
if == 0 {
.saved = nil
}
}
break
case CharData:
if .IsValid() {
= append(, ...)
}
case Comment:
if .IsValid() {
= append(, ...)
}
}
}
if .IsValid() && .CanInterface() && .Type().Implements(textUnmarshalerType) {
if := .Interface().(encoding.TextUnmarshaler).UnmarshalText(); != nil {
return
}
= reflect.Value{}
}
if .IsValid() && .CanAddr() {
:= .Addr()
if .CanInterface() && .Type().Implements(textUnmarshalerType) {
if := .Interface().(encoding.TextUnmarshaler).UnmarshalText(); != nil {
return
}
= reflect.Value{}
}
}
if := copyValue(, ); != nil {
return
}
switch := ; .Kind() {
case reflect.String:
.SetString(string())
case reflect.Slice:
.Set(reflect.ValueOf())
}
switch := ; .Kind() {
case reflect.String:
.SetString(string())
case reflect.Slice:
if .Type().Elem().Kind() == reflect.Uint8 {
.Set(reflect.ValueOf())
}
}
return nil
}
func ( reflect.Value, []byte) ( error) {
:=
if .Kind() == reflect.Ptr {
if .IsNil() {
.Set(reflect.New(.Type().Elem()))
}
= .Elem()
}
switch .Kind() {
default:
return errors.New("cannot unmarshal into " + .Type().String())
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
if len() == 0 {
.SetInt(0)
return nil
}
, := strconv.ParseInt(strings.TrimSpace(string()), 10, .Type().Bits())
if != nil {
return
}
.SetInt()
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
if len() == 0 {
.SetUint(0)
return nil
}
, := strconv.ParseUint(strings.TrimSpace(string()), 10, .Type().Bits())
if != nil {
return
}
.SetUint()
case reflect.Float32, reflect.Float64:
if len() == 0 {
.SetFloat(0)
return nil
}
, := strconv.ParseFloat(strings.TrimSpace(string()), .Type().Bits())
if != nil {
return
}
.SetFloat()
case reflect.Bool:
if len() == 0 {
.SetBool(false)
return nil
}
, := strconv.ParseBool(strings.TrimSpace(string()))
if != nil {
return
}
.SetBool()
case reflect.String:
.SetString(string())
case reflect.Slice:
return true, .unmarshal(.value(, initNilPointers), )
}
= true
func ( *Decoder) () error {
for {
, := .Token()
if != nil {
return
}
switch .(type) {
case StartElement:
if := .(); != nil {
return
}
case EndElement:
return nil
}
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |