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 }