• Publicidad

Eliminar marca de un XML

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Re: Eliminar marca de un XML

Notapor explorer » 2011-06-08 12:57 @581

Podrías hacerlo con el cuantificador {254,} que buscará coincidencias de 254 o más caracteres. Y, en ese caso, lo sustituimos por nada (lo quitamos). La palabra "recortar", habría que explicarla mejor.

P.D. Estamos en el foro Intermedio. :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-06-13 10:32 @480

Hola de nuevo.

Bueno a ver si me voy aclarando.

He construido una sentencia de cambio de texto de varias maneras pero no consigo eliminar las etiquetas con más de 254 caracteres, este es un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. s{<(tns:Motivos)> .{200,} </tns:Motivos>  \s*}{<$1>texto demasiado largo</$1>}gsix;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El problema es que mide el tamaño entre la primera etiqueta "Motivos" y la última etiqueta "Motivos" del XML. En vez de ir etiqueta por etiqueta.

Creo que no lo estoy poniendo en el sitio correcto o me falta algún comando.
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor explorer » 2011-06-13 11:57 @540

Cambia

{200,}

por

{200,}?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-06-13 16:07 @713

Ya lo intenté antes pero me cambia todas las etiquetas independientemente de su longitud.

O me las cambia todas, o no me cambia ninguna, o me cambia una desde la primera etiqueta del XML hasta la última.

Pero no consigo que según la longitud de la etiqueta la sustituya o no.

Por cierto entiendo que el punto que has puesto es gramatical y no de Perl.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -le  "local $/; $_ = <>; s{(<tns:)}{\r\n$1}gsix; s{<tns:imagen> .+? </tns:imagen>}{<tns:imagen></tns:imagen>}gsix; s{<(tns:Motivos)> {10,}?. </tns:Motivos>  \s*}{<$1>texto demasiado largo</$1>}gsix; print"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te muestro la línea completa: realizo 3 cambios; primero le pongo salto de carro a todos; luego elimino "imagen" y finalmente quisiera eliminar "motivos" demasiados largos.

De nuevo, muchas gracias por tu atención.
Última edición por explorer el 2011-06-13 16:47 @740, editado 1 vez en total
Razón: PERL -> Perl
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor explorer » 2011-06-13 16:48 @742

En efecto, el '.' es gramatical, así que, en tu línea, sobra.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-06-14 02:39 @152

Sí, sí, ya lo sé, es que copié mal el código, lo he probado de todas formas imaginables (excepto la buena, ¡je,je!).

La solución que muestras cambia las etiquetas independientemente de su longitud, aunque le ponga longitud 200 y el campo solo tenga 15 caracteres. Lo único que hace es empezar a buscar a partir del carácter 200 o el que le pongas en .{200,}?

Voy a intentar ser más preciso en mi ejemplo.

Si ejecuto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. s{<(tns:Motivos)> .{200,}? </tns:Motivos>}{<$1>texto demasiado largo</$1>}gsix;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me cambia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <tns:Motivos>DEFECTOS O MOTIVOS<span style="font-weight: bold"></tns:Motivos></span>
  2. <tns:Motivos>01) La marca solicitada se halla incursa en la prohibición del artº xxxxx) de la Ley de Marcas (xxxxxxx, de 7 de diciembre) al poder inducir al público a error sobre la naturaleza de los servicios para los que se solicita la marca, toda vez que el distintivo contiene el término "xxxxxxx" que no se corresponde con todo lo solicitado. Se podrá subsanar el defecto señalado, limitando los servicios a: "xxxxxx xx xxxxxx", aportando nueva lista de productos/servicios (en formulario oficial), o bien no limitar los servicios, y eliminar del distintivo el término "xxxxxxx", remitiendo xxxxxx la página nº 2 de la solicitud (apartado xxx), toda vez que dicha modificacion se considera que no altera xxxxxxxx la marca, conforme establece el Art. xxxx de la Ley de Marcas xxxxxx.</tns:Motivos></tns:SuspensoFondoLey17Marca>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

por esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <tns:Motivos>texto demasiado largo</tns:Motivos></tns:SuspensoFondoLey17Marca>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En el XML original hay 181 marcas o tags <tns:Motivos> mientras que en el texto convertido hay 98 (casi la mitad).

En el texto convertido también hay 98 <tns:Motivos>texto demasiado largo</tns:Motivos>; eso significa que los ha convertido todos sin excepción.

NOTA: He dejado el tag </tns:SuspensoFondoLey17Marca> para que sea fácil identificar qué ha cambiado.

El problema parece ser que casi siempre los <tns:Motivos> van precedidos por una <tns:Motivos> que es como un título pequeño. Parece que busca a partir del carácter 200; así pues, salta al siguiente <tns:Motivos> y lo cambia por todo, eliminando un tag completo del XML.

Ese es mi problema, disculpa sino lo aclaré bien.
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor explorer » 2011-06-14 08:27 @394

Sí, no es tan obvia la solución... no era correcta la que te he dado...

Si ponemos

.{200,}?

intentará buscar 200 caracteres, como mínimo, antes de alcanzar el patrón que le sigue (la marca de final de <tns:Motivos>).

El problema es que el comodín '.' busca todos los caracteres, incluido los caracteres que forman las propias marcas <tns:Motivos>. Por eso, en los casos en los que tenemos menos de 200 caracteres (como los títulos), el comodín se "come" todo lo que pille, pasando por encima de las marcas de cierre.

La solución es indicar, expresamente, que no queremos que entre esos 200 caracteres, se encuentre la marca de cierre.

Dado este fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <tns:Motivos>DEFECTOS O MOTIVOS<strong></tns:Motivos></strong>
  2. <tns:Motivos>01) La marca solicitada se halla incursa en la
  3. prohibición del artº xxxxx) de la Ley de Marcas (xxxxxxx, de 7 de
  4. diciembre) al poder inducir al público a error sobre la naturaleza
  5. de los servicios para los que se solicita la marca, toda vez que el
  6. distintivo contiene el término "xxxxxxx" que no se corresponde con
  7. todo lo solicitado. Se podrá subsanar el defecto señalado, limitando
  8. los servicios a: "xxxxxx xx xxxxxx", aportando nueva lista de
  9. productos/servicios (en formulario oficial), o bien no limitar los
  10. servicios, y eliminar del distintivo el término "xxxxxxx",
  11. remitiendo xxxxxx la página nº 2 de la solicitud (apartado xxx),
  12. toda vez que dicha modificacion se considera que no altera xxxxxxxx
  13. la marca, conforme establece el Art. xxxx de la Ley de Marcas
  14. xxxxxx.</tns:Motivos>
  15.        
  16. <tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
  17. <tns:Motivos>02) La marca solicitada se halla incursa en la
  18. prohibición del artº xxxxx) de la Ley de Marcas (xxxxxxx, de 7 de
  19. diciembre) al poder inducir al público a error sobre la naturaleza
  20. de los servicios para los que se solicita la marca, toda vez que el
  21. distintivo contiene el término "xxxxxxx" que no se corresponde con
  22. todo lo solicitado. Se podrá subsanar el defecto señalado, limitando
  23. los servicios a: "xxxxxx xx xxxxxx", aportando nueva lista de
  24. productos/servicios (en formulario oficial), o bien no limitar los
  25. servicios, y eliminar del distintivo el término "xxxxxxx",
  26. remitiendo xxxxxx la página nº 2 de la solicitud (apartado xxx),
  27. toda vez que dicha modificacion se considera que no altera xxxxxxxx
  28. la marca, conforme establece el Art. xxxx de la Ley de Marcas
  29. xxxxxx.</tns:Motivos>
  30.        
  31.  
  32. <tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
  33. <tns:Motivos>01) La marca solicitada se halla incursa en la
  34. la marca, conforme establece el Art. xxxx de la Ley de Marcas
  35. xxxxxx.</tns:Motivos>
  36.  
  37. <tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
  38. <tns:Motivos>02) La marca solicitada se halla incursa en la
  39. la marca, conforme establece el Art. xxxx de la Ley de Marcas
  40. xxxxxx.</tns:Motivos>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

con este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp 'slurp';
  3.  
  4. my $fichero = slurp('kk.xml');                  # leemos el fichero
  5.  
  6. $fichero
  7.     =~ s{
  8.             < (tns:motivos) >   # la marca que buscamos. La guardamos en $1 (y \1)
  9.  
  10.             (  
  11.                 (?!             #                     +-> que no esté precedido...
  12.                     </ \1 >     #                     |   ... de la marca de cierre
  13.                 )               #                     |
  14.                 .               # cualquier carácter -+
  15.             )
  16.             {200,}?             # más bien, un mínimo de 200 caracteres
  17.  
  18.             </ \1 >             # pero que sí estén seguidos de la marca de cierre
  19.         }
  20.         {<$1>-texto demasiado largo-</$1>}gisx          # nueva cadena de caracteres
  21.     ;
  22.  
  23. print $fichero;
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <tns:Motivos>DEFECTOS O MOTIVOS<strong></tns:Motivos></strong>
  2. <tns:Motivos>-texto demasiado largo-</tns:Motivos>
  3.        
  4. <tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
  5. <tns:Motivos>-texto demasiado largo-</tns:Motivos>
  6.        
  7.  
  8. <tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
  9. <tns:Motivos>01) La marca solicitada se halla incursa en la
  10. la marca, conforme establece el Art. xxxx de la Ley de Marcas
  11. xxxxxx.</tns:Motivos>
  12.  
  13. <tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
  14. <tns:Motivos>02) La marca solicitada se halla incursa en la
  15. la marca, conforme establece el Art. xxxx de la Ley de Marcas
  16. xxxxxx.</tns:Motivos>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Ahora ya está bien.

Además, los paréntesis de captura de las líneas 17 y 23 los puedes usar para tener en $2 el texto capturado (los 200 caracteres, como mínimo). Si no te interesa esa captura, puedes cambiar la línea 17 por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.             (?:
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ya no habrá captura (el programa irá un poco más rápido).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados