´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">&lt;<a href="mailto:monobot.soft@gmail.com">monobot.soft@gmail.com</a>&gt;</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">&lt;<a href="mailto:morillas@gmail.com" target="_blank">morillas@gmail.com</a>&gt;</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 &lt;<a href="mailto:monobot.soft@gmail.com" target="_blank">monobot.soft@gmail.com</a>&gt; escribió:<br>
<div><div></div><div>&gt; la línea 83 está en la función de grabado:<br>
&gt;     def grabar(self, event):<br>
&gt;         dialogo=wx.MessageDialog(None, &#39;¿Desea Grabar y Salir?&#39;, &#39;Atención&#39;,<br>
&gt; wx.YES_NO|wx.ICON_QUESTION|wx.STAY_ON_TOP)<br>
&gt;         respuesta=dialogo.ShowModal()<br>
&gt;         if (respuesta ==wx.ID_YES):<br>
&gt;             print &#39;obteniendo valores...&#39;<br>
&gt;             nombres_attr = [&#39;numerocolegiado&#39;,&#39;nombre&#39;, &#39;primerapellido&#39;,<br>
&gt; &#39;segundoapellido&#39;, &#39;dni&#39;, &#39;direccion&#39;, &#39;codigopostal&#39;, &#39;poblacion&#39;, &#39;email&#39;,<br>
&gt; &#39;telefono1&#39;, &#39;telefono2&#39;]<br>
&gt;             datos_entrados = [self.ventana.entranumcol,<br>
&gt; self.ventana.entranombre, self.ventana.entraapellido1,<br>
&gt; self.ventana.entraapellido2, self.ventana.entradni, self.ventana.entradirec,<br>
&gt; self.ventana.entrapost, self.ventana.entrapobl, self.ventana.entraemail,<br>
&gt; self.ventana.entratf1, self.ventana.entratf2]<br>
&gt;             print &#39;guardando...&#39;<br>
&gt;             for m in range(len(datos_entrados)):<br>
&gt;                 cambia_attrib(arbol=&#39;usuario&#39;, dato=nombres_attr[m],<br>
&gt; nuevovalor=reg_xml(datos_entrados[m].GetValue()))<br>
&gt;             nom_empr = [&#39;nombreempresa&#39;, &#39;cifempresa&#39;,<br>
&gt; &#39;direccionempresa&#39;,&#39;codigopostalempresa&#39;, &#39;telefonoempresa&#39;]<br>
&gt;             dat_empr = [self.ventana.entranombreempresa,<br>
&gt; self.ventana.entracifempresa, self.ventana.entradireccionempresa,<br>
&gt; self.ventana.entracodigopostalempresa, self.ventana.entratelefonoempresa]<br>
&gt;             for m in range(len(nom_empr)):<br>
&gt;                 cambia_attrib(arbol=&#39;datosempresa&#39;, dato=nom_empr[m],<br>
&gt; nuevovalor=reg_xml(dat_empr[m].GetValue()))<br>
&gt;             cambia_attrib(&#39;usuario&#39;, &#39;colegio&#39;,<br>
&gt; reg_xml(self.ventana.entracolegio.GetStringSelection()))<br>
&gt;             cambia_attrib(&#39;usuario&#39;, &#39;provincia&#39;,<br>
&gt; reg_xml(self.ventana.entraprov.GetStringSelection()))<br>
&gt;             guarda_datos(datogral)<br>
&gt;             print &#39;guardado&#39;<br>
&gt;             self.Destroy()<br>
&gt;         else:<br>
&gt;             print &#39;Cancelado&#39;<br>
&gt;             dialogo.Destroy()<br>
&gt; la función de grabado lo que hace es llamar a unas<br>
&gt; variables self.ventana.entranombreempresa     todas ellas se montan de esta<br>
&gt; forma:<br>
&gt; self.ventana.entranombre = wx.TextCtrl(self.ventana, -1, nombre_en_fichero)<br>
&gt; y el valor por defecto de cada una proviene del fichero xml también:<br>
&gt; nombre_en_fichero = xml_none(busqueda_xml (&#39;usuario&#39;, &#39;nombre&#39;))<br>
&gt; así que lo que hago es:<br>
&gt; lee xml ---&gt; muestra en pantalla el dato guardado ---&gt; el usuario cambia los<br>
&gt; datos ---&gt; grabo los datos.<br>
&gt; las funciones de lectura y guardado de xml son:<br>
&gt; def busqueda_xml (arbol, dato):<br>
&gt;     valor =<br>
&gt; arbol_gral.getElementsByTagName(arbol)[0].getElementsByTagName(dato)[0].childNodes[0].nodeValue<br>
&gt;     return valor<br>
&gt; def guarda_datos(archivo):<br>
&gt;     fichero = open(os.path.realpath(archivo), &quot;w&quot;)<br>
&gt;     arbol_gral.writexml(fichero, encoding=&#39;iso-8859-1&#39;)<br>
&gt;     fichero.close()<br>
&gt;     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),  &quot;w&quot;, &#39;iso-8859-1&#39;)<br>
<div>      arbol_gral.writexml(fichero, encoding=&#39;iso-8859-1&#39;)<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>
&gt; la funcion xml_none lo que hace es cambiar una entrada igual a cero por un<br>
&gt; campo limpio<br>
&gt; def xml_none(m):<br>
&gt;     if m ==&#39;0&#39;:<br>
&gt;         n = &#39;&#39;<br>
&gt;         return n<br>
&gt;     return m<br>
&gt; la función contraria la pongo al grabar y lo que hace es convertir un campo<br>
&gt; vacío en un 0, y también los caracteres prohibidos por xml por sus sutitutos<br>
&gt; ... así evito el error al grabar.<br>
&gt;<br>
&gt; def reg_xml(m):<br>
&gt;     if m == &#39;&#39;:<br>
&gt;         n = &#39;0&#39;<br>
&gt;         return n<br>
&gt;     n = m.replace(&#39;&amp;&#39;, &#39;&amp;amp&#39;)<br>
&gt;     n = n.replace(&#39;&lt;&#39;,&#39;&amp;lt&#39;)<br>
&gt;     n = n.replace(&#39;&gt;&#39;,&#39;&amp;gt&#39;)<br>
&gt;     return n<br>
&gt;<br>
&gt; --<br>
&gt; <a href="http://monobotblog.alvarezalonso.es" target="_blank">monobotblog.alvarezalonso.es</a><br>
</div><div><div></div><div>&gt; _______________________________________________<br>
&gt; Python-es mailing list<br>
&gt; <a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
&gt; <a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
&gt; FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
&gt;<br>
&gt;<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>