El día 4 de abril de 2010 10:26, monoBOT <monobot.s...@gmail.com> escribió: > la línea 83 está en la función de grabado: > def grabar(self, event): > dialogo=wx.MessageDialog(None, '¿Desea Grabar y Salir?', 'Atención', > wx.YES_NO|wx.ICON_QUESTION|wx.STAY_ON_TOP) > respuesta=dialogo.ShowModal() > if (respuesta ==wx.ID_YES): > print 'obteniendo valores...' > nombres_attr = ['numerocolegiado','nombre', 'primerapellido', > 'segundoapellido', 'dni', 'direccion', 'codigopostal', 'poblacion', 'email', > 'telefono1', 'telefono2'] > datos_entrados = [self.ventana.entranumcol, > self.ventana.entranombre, self.ventana.entraapellido1, > self.ventana.entraapellido2, self.ventana.entradni, self.ventana.entradirec, > self.ventana.entrapost, self.ventana.entrapobl, self.ventana.entraemail, > self.ventana.entratf1, self.ventana.entratf2] > print 'guardando...' > for m in range(len(datos_entrados)): > cambia_attrib(arbol='usuario', dato=nombres_attr[m], > nuevovalor=reg_xml(datos_entrados[m].GetValue())) > nom_empr = ['nombreempresa', 'cifempresa', > 'direccionempresa','codigopostalempresa', 'telefonoempresa'] > dat_empr = [self.ventana.entranombreempresa, > self.ventana.entracifempresa, self.ventana.entradireccionempresa, > self.ventana.entracodigopostalempresa, self.ventana.entratelefonoempresa] > for m in range(len(nom_empr)): > cambia_attrib(arbol='datosempresa', dato=nom_empr[m], > nuevovalor=reg_xml(dat_empr[m].GetValue())) > cambia_attrib('usuario', 'colegio', > reg_xml(self.ventana.entracolegio.GetStringSelection())) > cambia_attrib('usuario', 'provincia', > reg_xml(self.ventana.entraprov.GetStringSelection())) > guarda_datos(datogral) > print 'guardado' > self.Destroy() > else: > print 'Cancelado' > dialogo.Destroy() > la función de grabado lo que hace es llamar a unas > variables self.ventana.entranombreempresa todas ellas se montan de esta > forma: > self.ventana.entranombre = wx.TextCtrl(self.ventana, -1, nombre_en_fichero) > y el valor por defecto de cada una proviene del fichero xml también: > nombre_en_fichero = xml_none(busqueda_xml ('usuario', 'nombre')) > así que lo que hago es: > lee xml ---> muestra en pantalla el dato guardado ---> el usuario cambia los > datos ---> grabo los datos. > las funciones de lectura y guardado de xml son: > def busqueda_xml (arbol, dato): > valor = > arbol_gral.getElementsByTagName(arbol)[0].getElementsByTagName(dato)[0].childNodes[0].nodeValue > return valor > def guarda_datos(archivo): > fichero = open(os.path.realpath(archivo), "w") > arbol_gral.writexml(fichero, encoding='iso-8859-1') > fichero.close() > return True
El error lo genera writexml en esta función. Yo no utilizo minidom, pero supongo que esto te funcionará: import codecs # esto ponlo al principio del fichero def guarda_datos(archivo): fichero = codecs.open(os.path.realpath(archivo), "w", 'iso-8859-1') arbol_gral.writexml(fichero, encoding='iso-8859-1') fichero.close() return True Si quieres utilizar tu código en un sistema en producción, habría que revisar algunas cosas. Yo te recomiendo utilizar otros módulos en lugar de minidom. Echa un vistazo a Amara (http://wiki.xml3k.org/Amara2), te permite manejar xml como si fueran objetos python. --lm > la funcion xml_none lo que hace es cambiar una entrada igual a cero por un > campo limpio > def xml_none(m): > if m =='0': > n = '' > return n > return m > la función contraria la pongo al grabar y lo que hace es convertir un campo > vacío en un 0, y también los caracteres prohibidos por xml por sus sutitutos > ... así evito el error al grabar. > > def reg_xml(m): > if m == '': > n = '0' > return n > n = m.replace('&', '&') > n = n.replace('<','<') > n = n.replace('>','>') > return n > > -- > monobotblog.alvarezalonso.es > _______________________________________________ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/