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 1 de 2  [ 27 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2011-02-25 08:24 @391

Perlero Nuevo
Registrado: 2010-10-13 08:54 @412
Mensajes: 28
Eliminar marca de un XML
Hola amigos.
Tal como les comento, lo que necesito es eliminar un tag de un XML.

Sé que tengo poca experiencia en este lenguaje, pero también sé que es el más rápido.
Gracias por su ayuda.


Nota 2011-02-25 08:32 @397
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Bueno, depende de qué marca sea...

¿Tiene marca de final o es un marca cerrada en sí misma (< .../>)?

¿Está en una línea del XML o en varias?

¿Está la marca de inicio en la misma línea que la de final?

¿Qué hacemos con su contenido?

_________________
JF^D Perl programming


Nota 2011-02-25 08:53 @411

Perlero Nuevo
Registrado: 2010-10-13 08:54 @412
Mensajes: 28
Re: Eliminar marca de un XML
Amigo, de nuevo muchas gracias por la respuesta. Me expresé mal: no se trata de una "marca", sino de un TAG del XML.

Aquí las respuestas:
¿Tiene marca de final o es un marca cerrada en sí misma (< .../>)?
Sí, tiene <> inicio y </> bien delimitado.

¿Está en una línea del XML o en varias?
Puede aparecer en varias partes del xml.

¿Está la marca de inicio en la misma línea que la de final?
No, no está en la misma línea. Además puede tener subniveles, que también deben eliminarse, o sea, todo lo que este dentro del TAG

¿Qué hacemos con su contenido?
Tengo la idea de generar un nuevo XML sin el TAG que te menciono. Esto debe ser más fácil que eliminar en el archivo de origen.

Se trata de archivos gigantes, pueden llegar a pesar 200 MB.

Eso, muchas gracias.


Nota 2011-02-25 11:09 @506
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
La palabra 'tag' en inglés, significa 'etiqueta' o 'marca' :)

Para procesar ficheros tan grandes, no es recomendable el uso de módulos como XML::Simple, pues la cantidad de memoria generada sería muchísimo mayor.

Si la etiqueta (tag :)) se puede encontrar con tan solo recorrer el xml, línea a línea, pues entonces estamos hablando de algo muy sencillo: abrir el fichero, abrir el fichero de salida, ir copiando líneas de uno a otro, cuando encontremos una línea con la marca, eliminamos esa parte, y eliminamos el resto de líneas hasta encontrar la marca de final, y así seguimos hasta el final de fichero.

_________________
JF^D Perl programming


Nota 2011-02-25 11:25 @517
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Bueno... ahora que lo pienso... 200MB no es mucho...

Se podría también leer todo el fichero en memoria y aplicar una expresión regular para quitar las marcas y su contenido.

Estaría bien que publicaras un ejemplo pequeño del xml.

_________________
JF^D Perl programming


Nota 2011-02-25 11:40 @527

Perlero Nuevo
Registrado: 2010-10-13 08:54 @412
Mensajes: 28
Re: Eliminar marca de un XML
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <CtaCte><DTE>
  3.   <Documento>
  4.     <Encabezado>
  5.       <IdDoc><TipoDTE>39</TipoDTE><Folio>5659289</Folio><FchEmis>2011-02-16</FchEmis><IndServicio>2</IndServicio><PeriodoDesde>2009-03-21</PeriodoDesde><PeriodoHasta>2009-08-20</PeriodoHasta><FchVenc>2011-03-02</FchVenc></IdDoc>
  6.       <Receptor><RUTRecep>7848204-4</RUTRecep><CdgIntRecep>50008820</CdgIntRecep><RznSocRecep>HIPOLITO OSVALDO CORREA TURE</RznSocRecep><Contacto>asotor@autopistacentral.cl</Contacto><DirRecep>PSJE 46 2674 POBLACI?N SANTA ADRIANA</DirRecep><CmnaRecep>LO ESPEJO</CmnaRecep><CiudadRecep>SANTIAGO</CiudadRecep><DirPostal>PSJE 46 2674 POBLACI?N SANTA ADRIANA</DirPostal><CmnaPostal>LO ESPEJO</CmnaPostal><CiudadPostal>SANTIAGO</CiudadPostal></Receptor>
  7.       <Totales><MntNeto>7550</MntNeto><MntExe>2992</MntExe><TasaIVA>19</TasaIVA>
  8.         <IVA>1435</IVA><MntTotal>11977</MntTotal></Totales>
  9.     </Encabezado>
  10.   </Documento>
  11.   <DatosAdicionales>
  12.     <LAYOUT>
  13.       <HISTOGRAMA>
  14.         <CONSUMO1>0</CONSUMO1>
  15.         <MM1>08</MM1>
  16.         <AA1>2010</AA1>
  17.         <CONSUMO2>0</CONSUMO2>
  18.         <MM2>09</MM2>
  19.         <AA2>2010</AA2>
  20.       </HISTOGRAMA>
  21.       <DETCONSUMO2>
  22.           <DETALLE>
  23.             <MATRICULA>UZ1526</MATRICULA>
  24.             <PEAJEACSA>2.561,00</PEAJEACSA>
  25.             <PEAJEURBANA>0,00</PEAJEURBANA>
  26.             <PEAJEINTERURBANA></PEAJEINTERURBANA>
  27.             <ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
  28.           </DETALLE>
  29.           <TOTAL>
  30.             <TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
  31.             <TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
  32.           </TOTAL>
  33.       </DETCONSUMO2>
  34. </DatosAdicionales>
  35.   <DatosAdicionales>
  36.     <LAYOUT>
  37.       <HISTOGRAMA>
  38.         <CONSUMO1>0</CONSUMO1>
  39.         <MM1>08</MM1>
  40.         <AA1>2010</AA1>
  41.         <CONSUMO2>0</CONSUMO2>
  42.         <MM2>09</MM2>
  43.         <AA2>2010</AA2>
  44.       </HISTOGRAMA>
  45.       <DETCONSUMO2>
  46.           <DETALLE>
  47.             <MATRICULA>UZ1526</MATRICULA>
  48.             <PEAJEACSA>2.561,00</PEAJEACSA>
  49.             <PEAJEURBANA>0,00</PEAJEURBANA>
  50.             <PEAJEINTERURBANA></PEAJEINTERURBANA>
  51.             <ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
  52.           </DETALLE>
  53.           <TOTAL>
  54.             <TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
  55.             <TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
  56.           </TOTAL>
  57.       </DETCONSUMO2>
  58. </DatosAdicionales>
  59. </CtaCte><DTE>


Por ejemplo, eliminar el tag <HISTOGRAMA>.

Gracias nuevamente.


Nota 2011-02-25 12:27 @560
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Bueno, siendo tan sencillo, se puede resolver en una sola línea:
Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
  1. perl -00 -e '$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print' fichero.xml


Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <CtaCte><DTE>
  3.   <Documento>
  4.     <Encabezado>
  5.       <IdDoc><TipoDTE>39</TipoDTE><Folio>5659289</Folio><FchEmis>2011-02-16</FchEmis><IndServicio>2</IndServicio><PeriodoDesde>2009-03-21</PeriodoDesde><PeriodoHasta>2009-08-20</PeriodoHasta><FchVenc>2011-03-02</FchVenc></IdDoc>
  6.       <Receptor><RUTRecep>7848204-4</RUTRecep><CdgIntRecep>50008820</CdgIntRecep><RznSocRecep>HIPOLITO OSVALDO CORREA TURE</RznSocRecep><Contacto>asotor@autopistacentral.cl</Contacto><DirRecep>PSJE 46 2674 POBLACI?N SANTA ADRIANA</DirRecep><CmnaRecep>LO ESPEJO</CmnaRecep><CiudadRecep>SANTIAGO</CiudadRecep><DirPostal>PSJE 46 2674 POBLACI?N SANTA ADRIANA</DirPostal><CmnaPostal>LO ESPEJO</CmnaPostal><CiudadPostal>SANTIAGO</CiudadPostal></Receptor>
  7.       <Totales><MntNeto>7550</MntNeto><MntExe>2992</MntExe><TasaIVA>19</TasaIVA>
  8.         <IVA>1435</IVA><MntTotal>11977</MntTotal></Totales>
  9.     </Encabezado>
  10.   </Documento>
  11.   <DatosAdicionales>
  12.     <LAYOUT>
  13.       <DETCONSUMO2>
  14.           <DETALLE>
  15.             <MATRICULA>UZ1526</MATRICULA>
  16.             <PEAJEACSA>2.561,00</PEAJEACSA>
  17.             <PEAJEURBANA>0,00</PEAJEURBANA>
  18.             <PEAJEINTERURBANA></PEAJEINTERURBANA>
  19.             <ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
  20.           </DETALLE>
  21.           <TOTAL>
  22.             <TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
  23.             <TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
  24.           </TOTAL>
  25.       </DETCONSUMO2>
  26. </DatosAdicionales>
  27.   <DatosAdicionales>
  28.     <LAYOUT>
  29.       <DETCONSUMO2>
  30.           <DETALLE>
  31.             <MATRICULA>UZ1526</MATRICULA>
  32.             <PEAJEACSA>2.561,00</PEAJEACSA>
  33.             <PEAJEURBANA>0,00</PEAJEURBANA>
  34.             <PEAJEINTERURBANA></PEAJEINTERURBANA>
  35.             <ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
  36.           </DETALLE>
  37.           <TOTAL>
  38.             <TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
  39.             <TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
  40.           </TOTAL>
  41.       </DETCONSUMO2>
  42. </DatosAdicionales>
  43. </CtaCte><DTE>

_________________
JF^D Perl programming


Nota 2011-02-28 07:32 @355

Perlero Nuevo
Registrado: 2010-10-13 08:54 @412
Mensajes: 28
Re: Eliminar marca de un XML
Un poco de paciencia, por favor.
Al ejecutar la línea

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
perl -00 -e '$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print' prueba.xml


desde una sesión de MSDOS, me envía el siguiente error.

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
No se esperaba > en este momento.


¡¡Gracias!!


Nota 2011-02-28 07:45 @364
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Si aún estás trabajando en Windows/DOS (algo no recomendable trabajando con ficheros grandes), debes intercambiar el significado de las comillas simples y dobles.

Queda:
Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
perl -00 -e "$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print" prueba.xml

_________________
JF^D Perl programming


Nota 2011-03-12 08:20 @389

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

He visto este post ya que tenía justo el mismo problema (eliminar una etiqueta xml). Lo he seguido al pie de la letra y ha ido de lujo, muchas gracias.

Yo no es que quisiera eliminar la etiqueta por ninguna lógica de negocio en especial, sino simplemente porque ocupa demasiado espacio, es una etiqueta que codifica una imagen, el xml ocupa unos 10-15mb y tras eliminar la etiqueta imagen queda en unos pocos cientos de kb, tamaño que ya sí puedo tratar.

El problema es que ahora cuando abro el xml con mi programa hecho en foxpro, la función XMLTOCURSOR() me dice: No se puede deducir el esquema.

He pensado que quizás el error pueda corregirlo eliminando exclusivamente el contenido de la etiqueta xml.

¿Podría alguien mostrar cómo sería el código para eliminar solo el contenido de la etiqueta?

Muchas gracias por vuestro tiempo, el foro está genial.


Nota 2011-03-12 10:23 @474
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Bienvenido a los foros de Perl en Español, l0g0s

Esta es una forma de hacerlo:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. perl -00 -e "$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{<HISTOGRAMA></HISTOGRAMA>}gsix; print" prueba.xml


Esta es otra forma, un poco más corta:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. perl -00 -e "$_ = <>; s{(<HISTOGRAMA>) .+? (</HISTOGRAMA>) \s*}{$1$2}gsix; print" prueba.xml

_________________
JF^D Perl programming


Nota 2011-03-12 12:21 @556

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
Muchas gracias.

Estoy impresionado con Perl. Pensaba hacer el vbs. De hecho ya lo tenía medio terminado, pero hay que hacer una barbaridad de cosas: abre objetos, cierra objetos, repasa línea a línea, busca, corta, monta, en fin, el código es tremendo, ¡y con Perl es una simple línea!


Nota 2011-03-12 17:23 @766
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
Perl está especializado en el tratamiento de ficheros de texto, por eso es tan potente.

De todas maneras, fíjate que estamos en el foro Intermedio, y por eso se ha ofrecido una solución de una-línea, pero lo normal sería realizar una versión en forma de programa, para que los programadores más novatos entendieran bien los conceptos (ya habrá tiempo para que se metan con los arcanos más oscuros :wink: )

_________________
JF^D Perl programming


Nota 2011-03-27 11:16 @511

Perlero Nuevo
Registrado: 2011-03-12 08:12 @383
Mensajes: 10
Re: Eliminar marca de un XML
Sí, porque, la verdad que cuesta entender la línea que has escrito en Perl.

Parece ser que de alguna forma sustituyes lo que está entre los primeros corchetes {} por los segundos.

Pero, por ejemplo, si quisiera eliminar unas cuantas marcas (claro, siempre podría repetir el proceso sobre el fichero resultante), pero supongo que Perl es capaz de hacerlo todo en uno, pasarle, por ejemplo, 10 o 50 marcas y que me las quite todas del tirón, o ya haría falta más de una línea, no sé.

Estaría bien una pequeña explicación de algunos comandos que has usado como $_ = <> \s* gsix.

En fin, sino es molestia, como ya digo, he intentado eliminar más de una marca a la vez y no me sale.

¡Salu2!


Nota 2011-03-27 11:39 @527
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Eliminar marca de un XML
l0g0s escribió:
Parece ser que de alguna forma sustituyes lo que está entre los primeros corchetes {} por los segundos.
En Perl, en el operador de sustitución, se pueden usar muchos delimitadores distintos. Si se usan las llaves, entonces no hay confusión con los caracteres '/', y por lo tanto, no hay que "espacarlos" para distinguirlos de los delimitadores del operador.

l0g0s escribió:
Pero, por ejemplo, si quisiera eliminar unas cuantas marcas (claro, siempre podría repetir el proceso sobre el fichero resultante), pero supongo que Perl es capaz de hacerlo todo en uno, pasarle, por ejemplo, 10 o 50 marcas y que me las quite todas del tirón, o ya haría falta más de una línea, no sé.
Una solución sería meter todas las marcas en un conjunto de alternativas:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
perl -00 -le '$_ = <>; s{<(HISTOGRAMA|DETALLE)> .+? </\1>}{<$1></$1>}gsix; print' prueba.xml
(He vuelto a poner las comillas de Linux, que es donde trabajo)

De todas maneras, si el número de marcas empieza a crecer, es mucho mejor escribir un programa, ya que es más fácil de editar, que no una sola línea que se puede hacer muy larga y complicada.

l0g0s escribió:
Estaría bien una pequeña explicación de algunos comandos que has usado como $_ = <> \s* gsix.
El significado de $_ lo tienes en perldoc perlvar, el de <> en perldoc perlop, y el de \s* y gsix en perldoc perlre.

_________________
JF^D Perl programming


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

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