Source File
xml_to_struct.go
Belonging Package
github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
package xmlutil
import (
)
func ( *xml.Decoder, *xml.StartElement) (*XMLNode, error) {
:= &XMLNode{}
for {
, := .Token()
if != nil {
if == io.EOF {
break
} else {
return ,
}
}
if == nil {
break
}
switch typed := .(type) {
case xml.CharData:
.Text = string(.Copy())
case xml.StartElement:
:= .Copy()
.Attr = .Attr
if .Children == nil {
.Children = map[string][]*XMLNode{}
}
:= .Name.Local
:= .Children[]
if == nil {
= []*XMLNode{}
}
, := (, &)
.findNamespaces()
if != nil {
return ,
}
.Name = .Name
.findNamespaces()
.parent = &
= append(, )
.Children[] =
case xml.EndElement:
if != nil && .Name.Local == .Name.Local { // matching end token
return , nil
}
= &XMLNode{}
}
}
return , nil
}
func ( *XMLNode) () {
:= map[string]string{}
for , := range .Attr {
if .Name.Space == "xmlns" {
[.Value] = .Name.Local
}
}
.namespaces =
}
func ( *XMLNode) ( string) (string, bool) {
for := ; != nil; = .parent {
for , := range .Attr {
:= .Name.Space
if , := .namespaces[]; {
=
}
if == fmt.Sprintf("%s:%s", , .Name.Local) {
return .Value, true
}
}
}
return "", false
}
:= .Attr
if {
:= make([]xml.Attr, len())
for , := range .Attr {
= append(, )
}
sort.Sort(xmlAttrSlice())
=
}
.EncodeToken(xml.StartElement{Name: .Name, Attr: })
if .Text != "" {
.EncodeToken(xml.CharData([]byte(.Text)))
} else if {
:= []string{}
for := range .Children {
= append(, )
}
sort.Strings()
for , := range {
for , := range .Children[] {
(, , )
}
}
} else {
for , := range .Children {
for , := range {
(, , )
}
}
}
.EncodeToken(xml.EndElement{Name: .Name})
return .Flush()
![]() |
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. |