func()

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
}