private static string ReadCategory(XmlNode node, Category parent)
    {
        if (node.Name == "Category")
        {
            string name = NodeGetString(node, "name");
            string visiblename = NodeGetString(node, "visiblename");
            string code = NodeGetString(node, "code");
//            Category parent = (Category) NodeGetObject(node, "parentcode", categories);
//            if (parent == null)
//                parent = (Category) NodeGetObject(node, "category", categories);
            Template t = (Template) NodeGetObject(node, "template", templates);
            Role r = (Role) NodeGetObject(node, "role", roles);
            //	string ayuda = NodeGetString(node, "ayuda");

            Category c = new Category ();
            if (name != "" && visiblename == "")
                visiblename = name;
            if (name == "" && visiblename != "")
                name = visiblename;
            c.Name = name;
            c.Description = visiblename;
            c.Code = code;
            if (parent != null)
                c.Parent = parent;
            c.Template = t;
            c.AnonRole = r;
            //c.Information = ayuda;
            c.Save();

            System.Console.WriteLine ("Categoria: "+ name);
            c.AclSet = NodeGetObjectSet(node, "Acl", acls);

            c.Save();
            categories[name] = c;
            if (categories[code] == null)
                categories[code] = c;
            else
                System.Console.WriteLine("Hay otra categoría con el mismo CODE ({0})", c.Description);

            foreach (XmlNode n in node.ChildNodes)
            {
                if (n.Name == "Category")
                    ReadCategory(n, c);
                else
                {
                    if (n.Name == "Content")
                        ReadContent(n, c);
                }
            }
        }
        return null;
    }