2011-03-27 17:52 @786 |
|
|
l0g0s
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.
|
2011-05-07 08:31 @396 |
|
|
l0g0s
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í: Using perl Syntax Highlighting 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: Using perl Syntax Highlighting 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?
|
2011-05-07 09:03 @419 |
|
|
 |
explorer
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: Using bash Syntax Highlighting perl -le "local $/; $_ = <>; s{<tns:imagen> .+? </tns:imagen>}{<tns:imagen></tns:imagen>}gsix; print " C:\archivo.xml
_________________ JF^D Perl programming
|
2011-05-07 09:20 @430 |
|
|
l0g0s
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
|
2011-06-08 11:51 @535 |
|
|
l0g0s
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?
|
2011-06-13 10:32 @480 |
|
|
l0g0s
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: Using perl Syntax Highlighting 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.
|
2011-06-13 16:07 @713 |
|
|
l0g0s
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. Using perl Syntax Highlighting 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 |
|
2011-06-14 02:39 @152 |
|
|
l0g0s
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: Using perl Syntax Highlighting s{<(tns:Motivos)> .{200,}? </tns:Motivos>}{<$1>texto demasiado largo</$1>}gsix;
Me cambia: Using xml Syntax Highlighting <tns:Motivos>DEFECTOS O MOTIVOS<strong></tns:Motivos></strong>
<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: Using xml Syntax Highlighting <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.
|
2011-06-14 08:27 @394 |
|
|
 |
explorer
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: Using xml Syntax Highlighting <tns:Motivos>DEFECTOS O MOTIVOS<strong></tns:Motivos></strong>
<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:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
<tns:Motivos>02) 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:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
<tns:Motivos>01) La marca solicitada se halla incursa en la
la marca, conforme establece el Art. xxxx de la Ley de Marcas
xxxxxx.</tns:Motivos>
<tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
<tns:Motivos>02) La marca solicitada se halla incursa en la
la marca, conforme establece el Art. xxxx de la Ley de Marcas
xxxxxx.</tns:Motivos>
con este programa: Using perl Syntax Highlighting #!/usr/bin/perl
use File::Slurp 'slurp';
my $fichero = slurp('kk.xml'); # leemos el fichero
$fichero
=~ s{
< (tns:motivos) > # la marca que buscamos. La guardamos en $1 (y \1)
(
(?! # +-> que no esté precedido...
</ \1 > # | ... de la marca de cierre
) # |
. # cualquier carácter -+
)
{200,}? # más bien, un mínimo de 200 caracteres
</ \1 > # pero que sí estén seguidos de la marca de cierre
}
{<$1>-texto demasiado largo-</$1>}gisx # nueva cadena de caracteres
;
print $fichero;
sale Using xml Syntax Highlighting <tns:Motivos>DEFECTOS O MOTIVOS<strong></tns:Motivos></strong>
<tns:Motivos>-texto demasiado largo-</tns:Motivos>
<tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
<tns:Motivos>-texto demasiado largo-</tns:Motivos>
<tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
<tns:Motivos>01) La marca solicitada se halla incursa en la
la marca, conforme establece el Art. xxxx de la Ley de Marcas
xxxxxx.</tns:Motivos>
<tns:Motivos>DEFECTOS O MOTIVOS</tns:Motivos>
<tns:Motivos>02) La marca solicitada se halla incursa en la
la marca, conforme establece el Art. xxxx de la Ley de Marcas
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 Using perl Syntax Highlighting y ya no habrá captura (el programa irá un poco más rápido).
_________________ JF^D Perl programming
|
| 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
|
|
Socializa |
 |
|