Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Eliminar marca de un XML Responder al tema
Nuevo tema


Página 2 de 2  [ 27 mensajes ]  Ir a página Anterior  1, 2
 
Nota 2011-03-27 17:52 @786

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
Muchas gracias, es verdaderamente increíble el potencial de Perl, lo vuelvo a decir, porque la última solución que has propuesto me ha dejado de nuevo impresionado.

Disculpa si te haya consultado esas cosas en vez de buscarlas por mi mismo, pero no creas que es fácil de "googlear" $_ por ejemplo, al ser una única letra es muy difícil que los buscadores lo admitan en su búsqueda, incluso tras tu ayuda he ido a http://perldoc.perl.org/perlvar.html ( "perldoc perlvar" ) y he puesto en su buscador $_ pero no aparece nada.

Claro que luego he seguido leyendo abajo y efectivamente explica muy bien cómo Perl interpreta la variable de entrada $_.

Muchas gracias de nuevo.


Nota 2011-05-07 08:31 @396

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
Hola,

Mientras probaba varias opciones con la línea de comandos de Perl similares a los ejemplos expuestos, algo así:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. perl -00 -e  "$_ = <>; s{(<tns:)}{\r\n$1}gsix; s{<(tns:imagen)> .+? </tns:imagen>}{<$1></$1>}gsix; print " C:\archivo.xml


aunque no tenía que ser necesariamente ese formato, también valen otros como este:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. perl -00 -le  "$_ = <>; s{<tns:imagen> .+? </tns:imagen>}{<tns:imagen></tns:imagen>}gsix; print " C:\archivo.xml


La cuestión es que fuera cual fuera el formato, siempre que encuentra una línea en blanco se para.

Es decir siempre que encuentra una línea que no contiene ningún otro carácter aparte del "salto de carro", deja de procesar el archivo.

¿Esto es normal? ¿me equivoco en algo?


Nota 2011-05-07 09:03 @419
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Quizás el problema esté en el -00 (modo "slurp"). No sé, no lo he probado.

Una solución sería asegurarse de que se lee todo el fichero de golpe, una sola vez:

Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
  1. perl -le  "local $/; $_ = <>; s{<tns:imagen> .+? </tns:imagen>}{<tns:imagen></tns:imagen>}gsix; print " C:\archivo.xml

_________________
JF^D Perl programming


Nota 2011-05-07 09:20 @430

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
Como siempre ¡das en la tecla! Muchas gracias XD


Nota 2011-06-08 11:51 @535

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
Una preguntas más, para rizar el rizo, sino te importa.

¿Cómo puedo recortar tags de xml que sean mayores a un tamaño, por ejemplo 254 caracteres?


Nota 2011-06-08 12:57 @581
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
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


Nota 2011-06-13 10:32 @480

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. s{<(tns:Motivos)> .{200,} </tns:Motivos>  \s*}{<$1>texto demasiado largo</$1>}gsix;


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.


Nota 2011-06-13 11:57 @540
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Cambia

{200,}

por

{200,}?

_________________
JF^D Perl programming


Nota 2011-06-13 16:07 @713

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
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.

Syntax: [ Download ] [ Hide ]
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"


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
PERL -> Perl


Nota 2011-06-13 16:48 @742
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
En efecto, el '.' es gramatical, así que, en tu línea, sobra.

_________________
JF^D Perl programming


Nota 2011-06-14 02:39 @152

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. s{<(tns:Motivos)> .{200,}? </tns:Motivos>}{<$1>texto demasiado largo</$1>}gsix;


Me cambia:
Syntax: [ Download ] [ Hide ]
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 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>

por esto:
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <tns:Motivos>texto demasiado largo</tns:Motivos></tns:SuspensoFondoLey17Marca>


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.


Nota 2011-06-14 08:27 @394
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
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:
Syntax: [ Download ] [ Hide ]
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>

con este programa:
Syntax: [ Download ] [ Hide ]
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.  

sale
Syntax: [ Download ] [ Hide ]
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>

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
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.             (?:

y ya no habrá captura (el programa irá un poco más rápido).

_________________
JF^D Perl programming


Responder al tema  [ 27 mensajes ]  Ir a página Anterior  1, 2

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO