in oss/xml_utils.go [88:145]
func (dec *XmlDecoderLite) decodeXML(root *XmlNode) error {
xmlDec := xml.NewDecoder(dec.reader)
started := false
// Create first element from the root node
elem := &element{
parent: nil,
n: root,
}
getToken := func() (xml.Token, error) {
if dec.useRawToken {
return xmlDec.RawToken()
}
return xmlDec.Token()
}
for {
t, e := getToken()
if e != nil && !errors.Is(e, io.EOF) {
return e
}
if t == nil {
break
}
switch se := t.(type) {
case xml.StartElement:
elem = &element{
parent: elem,
n: &XmlNode{},
label: se.Name.Local,
}
for _, a := range se.Attr {
elem.n.addChild(dec.attributePrefix+a.Name.Local, &XmlNode{Data: []string{a.Value}})
}
case xml.CharData:
newBit := trimNonGraphic(string(se))
if !started && len(newBit) > 0 {
return fmt.Errorf("invalid XML: Encountered chardata [%v] outside of XML node", newBit)
}
if len(newBit) > 0 {
elem.n.Data = append(elem.n.Data, newBit)
}
case xml.EndElement:
if elem.parent != nil {
elem.parent.n.addChild(elem.label, elem.n)
}
elem = elem.parent
}
started = true
}
return nil
}