´Funciona como un guante!!! ... muchas gracias luis miguel<br><br><div class="gmail_quote">El 4 de abril de 2010 23:04, monoBOT <span dir="ltr"><<a href="mailto:monobot.soft@gmail.com">monobot.soft@gmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Muchas gracias lo probare.<br><br><div class="gmail_quote">El 4 de abril de 2010 22:38, Luis Miguel Morillas <span dir="ltr"><<a href="mailto:morillas@gmail.com" target="_blank">morillas@gmail.com</a>></span> escribió:<div>
<div></div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
El día 4 de abril de 2010 10:26, monoBOT <<a href="mailto:monobot.soft@gmail.com" target="_blank">monobot.soft@gmail.com</a>> escribió:<br>
<div><div></div><div>> la línea 83 está en la función de grabado:<br>
> def grabar(self, event):<br>
> dialogo=wx.MessageDialog(None, '¿Desea Grabar y Salir?', 'Atención',<br>
> wx.YES_NO|wx.ICON_QUESTION|wx.STAY_ON_TOP)<br>
> respuesta=dialogo.ShowModal()<br>
> if (respuesta ==wx.ID_YES):<br>
> print 'obteniendo valores...'<br>
> nombres_attr = ['numerocolegiado','nombre', 'primerapellido',<br>
> 'segundoapellido', 'dni', 'direccion', 'codigopostal', 'poblacion', 'email',<br>
> 'telefono1', 'telefono2']<br>
> datos_entrados = [self.ventana.entranumcol,<br>
> self.ventana.entranombre, self.ventana.entraapellido1,<br>
> self.ventana.entraapellido2, self.ventana.entradni, self.ventana.entradirec,<br>
> self.ventana.entrapost, self.ventana.entrapobl, self.ventana.entraemail,<br>
> self.ventana.entratf1, self.ventana.entratf2]<br>
> print 'guardando...'<br>
> for m in range(len(datos_entrados)):<br>
> cambia_attrib(arbol='usuario', dato=nombres_attr[m],<br>
> nuevovalor=reg_xml(datos_entrados[m].GetValue()))<br>
> nom_empr = ['nombreempresa', 'cifempresa',<br>
> 'direccionempresa','codigopostalempresa', 'telefonoempresa']<br>
> dat_empr = [self.ventana.entranombreempresa,<br>
> self.ventana.entracifempresa, self.ventana.entradireccionempresa,<br>
> self.ventana.entracodigopostalempresa, self.ventana.entratelefonoempresa]<br>
> for m in range(len(nom_empr)):<br>
> cambia_attrib(arbol='datosempresa', dato=nom_empr[m],<br>
> nuevovalor=reg_xml(dat_empr[m].GetValue()))<br>
> cambia_attrib('usuario', 'colegio',<br>
> reg_xml(self.ventana.entracolegio.GetStringSelection()))<br>
> cambia_attrib('usuario', 'provincia',<br>
> reg_xml(self.ventana.entraprov.GetStringSelection()))<br>
> guarda_datos(datogral)<br>
> print 'guardado'<br>
> self.Destroy()<br>
> else:<br>
> print 'Cancelado'<br>
> dialogo.Destroy()<br>
> la función de grabado lo que hace es llamar a unas<br>
> variables self.ventana.entranombreempresa todas ellas se montan de esta<br>
> forma:<br>
> self.ventana.entranombre = wx.TextCtrl(self.ventana, -1, nombre_en_fichero)<br>
> y el valor por defecto de cada una proviene del fichero xml también:<br>
> nombre_en_fichero = xml_none(busqueda_xml ('usuario', 'nombre'))<br>
> así que lo que hago es:<br>
> lee xml ---> muestra en pantalla el dato guardado ---> el usuario cambia los<br>
> datos ---> grabo los datos.<br>
> las funciones de lectura y guardado de xml son:<br>
> def busqueda_xml (arbol, dato):<br>
> valor =<br>
> arbol_gral.getElementsByTagName(arbol)[0].getElementsByTagName(dato)[0].childNodes[0].nodeValue<br>
> return valor<br>
> def guarda_datos(archivo):<br>
> fichero = open(os.path.realpath(archivo), "w")<br>
> arbol_gral.writexml(fichero, encoding='iso-8859-1')<br>
> fichero.close()<br>
> return True<br>
<br>
</div></div>El error lo genera writexml en esta función. Yo no utilizo minidom,<br>
pero supongo que esto te funcionará:<br>
<br>
import codecs # esto ponlo al principio del fichero<br>
<br>
def guarda_datos(archivo):<br>
fichero = codecs.open(os.path.realpath(archivo), "w", 'iso-8859-1')<br>
<div> arbol_gral.writexml(fichero, encoding='iso-8859-1')<br>
fichero.close()<br>
return True<br>
<br>
</div>Si quieres utilizar tu código en un sistema en producción, habría que<br>
revisar algunas cosas. Yo te recomiendo utilizar otros módulos en<br>
lugar de minidom. Echa un vistazo a Amara<br>
(<a href="http://wiki.xml3k.org/Amara2" target="_blank">http://wiki.xml3k.org/Amara2</a>), te permite manejar xml como si fueran<br>
objetos python.<br>
<font color="#888888"><br>
--lm<br>
</font><div><br>
> la funcion xml_none lo que hace es cambiar una entrada igual a cero por un<br>
> campo limpio<br>
> def xml_none(m):<br>
> if m =='0':<br>
> n = ''<br>
> return n<br>
> return m<br>
> la función contraria la pongo al grabar y lo que hace es convertir un campo<br>
> vacío en un 0, y también los caracteres prohibidos por xml por sus sutitutos<br>
> ... así evito el error al grabar.<br>
><br>
> def reg_xml(m):<br>
> if m == '':<br>
> n = '0'<br>
> return n<br>
> n = m.replace('&', '&amp')<br>
> n = n.replace('<','&lt')<br>
> n = n.replace('>','&gt')<br>
> return n<br>
><br>
> --<br>
> <a href="http://monobotblog.alvarezalonso.es" target="_blank">monobotblog.alvarezalonso.es</a><br>
</div><div><div></div><div>> _______________________________________________<br>
> Python-es mailing list<br>
> <a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
> <a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
> FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
><br>
><br>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
</div></div></blockquote></div></div></div><br><br clear="all"><br>-- <br><div><div></div><div class="h5">Héctor Alvarez<br>Arquitecto<br><br>Advertencia legal:<br>De acuerdo a la vigente Ley Orgánica 15/1999 de Protección de Datos de carácter Personal le informamos que:<br>
Este correo electrónico contiene información privada y estrictamente confidencial. Si usted NO ES el destinatario, NO ESTA AUTORIZADO a leerlo, directa o indirectamente, usar, revelar, distribuir, imprimir o copiar ninguna de las partes y/o anexos de éste mensaje. Si por error ha recibido este mensaje, le rogamos lo notifique a su emisor respondiendo a éste e-mail y proceda a borrar de su sistema inmediatamente el mensaje así como todas sus copias.<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Héctor Alvarez<br>Arquitecto<br><br>Advertencia legal:<br>De acuerdo a la vigente Ley Orgánica 15/1999 de Protección de Datos de carácter Personal le informamos que:<br>
Este correo electrónico contiene información privada y estrictamente confidencial. Si usted NO ES el destinatario, NO ESTA AUTORIZADO a leerlo, directa o indirectamente, usar, revelar, distribuir, imprimir o copiar ninguna de las partes y/o anexos de éste mensaje. Si por error ha recibido este mensaje, le rogamos lo notifique a su emisor respondiendo a éste e-mail y proceda a borrar de su sistema inmediatamente el mensaje así como todas sus copias.<br>