Exemple #1
0
func node_to_json(node xml.Node) interface{} {
	if node == nil {
		return nil
	}
	switch node.Name() {
	case "null":
		return nil
	case "false":
		return false
	case "true":
		return true
	case "number":
		f, err := strconv.ParseFloat(node.Content(), 64)
		if err != nil {
			return nil
		}
		return f
	case "string":
		return node.Content()
	case "array":
		length := node.CountChildren()
		array := make([]interface{}, length)
		for elem, i := node.FirstChild(), 0; elem != nil; elem, i = elem.NextSibling(), i+1 {
			array[i] = node_to_json(elem)
		}
		return array
	case "object":
		object := make(map[string]interface{})
		for member := node.FirstChild(); member != nil; member = member.NextSibling() {
			if member.Name() != "member" || member.Attribute("name") == nil {
				// TODO: log a debugging message here
				continue // just skip nodes that aren't name-value pairs
			}
			object[member.Attr("name")] = node_to_json(member.FirstChild())
		}
		return object
	}
	// TODO: log a debugging message if we get to this point
	return nil
}