2011-02-25 08:24 @391 |
|
|
mgonzalez
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.
|
2011-02-25 08:53 @411 |
|
|
mgonzalez
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.
|
2011-02-25 11:09 @506 |
|
|
 |
explorer
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
|
2011-02-25 11:40 @527 |
|
|
mgonzalez
Perlero Nuevo
|
Registrado: 2010-10-13 08:54 @412 Mensajes: 28
|
|
|
Re: Eliminar marca de un XML
|
Using xml Syntax Highlighting <?xml version="1.0" encoding="ISO-8859-1"?>
<CtaCte><DTE>
<Documento>
<Encabezado>
<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>
<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>
<Totales><MntNeto>7550</MntNeto><MntExe>2992</MntExe><TasaIVA>19</TasaIVA>
<IVA>1435</IVA><MntTotal>11977</MntTotal></Totales>
</Encabezado>
</Documento>
<DatosAdicionales>
<LAYOUT>
<HISTOGRAMA>
<CONSUMO1>0</CONSUMO1>
<MM1>08</MM1>
<AA1>2010</AA1>
<CONSUMO2>0</CONSUMO2>
<MM2>09</MM2>
<AA2>2010</AA2>
</HISTOGRAMA>
<DETCONSUMO2>
<DETALLE>
<MATRICULA>UZ1526</MATRICULA>
<PEAJEACSA>2.561,00</PEAJEACSA>
<PEAJEURBANA>0,00</PEAJEURBANA>
<PEAJEINTERURBANA></PEAJEINTERURBANA>
<ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
</DETALLE>
<TOTAL>
<TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
<TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
</TOTAL>
</DETCONSUMO2>
</DatosAdicionales>
<DatosAdicionales>
<LAYOUT>
<HISTOGRAMA>
<CONSUMO1>0</CONSUMO1>
<MM1>08</MM1>
<AA1>2010</AA1>
<CONSUMO2>0</CONSUMO2>
<MM2>09</MM2>
<AA2>2010</AA2>
</HISTOGRAMA>
<DETCONSUMO2>
<DETALLE>
<MATRICULA>UZ1526</MATRICULA>
<PEAJEACSA>2.561,00</PEAJEACSA>
<PEAJEURBANA>0,00</PEAJEURBANA>
<PEAJEINTERURBANA></PEAJEINTERURBANA>
<ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
</DETALLE>
<TOTAL>
<TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
<TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
</TOTAL>
</DETCONSUMO2>
</DatosAdicionales>
</CtaCte><DTE>
Por ejemplo, eliminar el tag <HISTOGRAMA>. Gracias nuevamente.
|
2011-02-25 12:27 @560 |
|
|
 |
explorer
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: Using bash Syntax Highlighting perl -00 -e '$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print' fichero.xml
Using xml Syntax Highlighting <?xml version="1.0" encoding="ISO-8859-1"?>
<CtaCte><DTE>
<Documento>
<Encabezado>
<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>
<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>
<Totales><MntNeto>7550</MntNeto><MntExe>2992</MntExe><TasaIVA>19</TasaIVA>
<IVA>1435</IVA><MntTotal>11977</MntTotal></Totales>
</Encabezado>
</Documento>
<DatosAdicionales>
<LAYOUT>
<DETCONSUMO2>
<DETALLE>
<MATRICULA>UZ1526</MATRICULA>
<PEAJEACSA>2.561,00</PEAJEACSA>
<PEAJEURBANA>0,00</PEAJEURBANA>
<PEAJEINTERURBANA></PEAJEINTERURBANA>
<ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
</DETALLE>
<TOTAL>
<TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
<TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
</TOTAL>
</DETCONSUMO2>
</DatosAdicionales>
<DatosAdicionales>
<LAYOUT>
<DETCONSUMO2>
<DETALLE>
<MATRICULA>UZ1526</MATRICULA>
<PEAJEACSA>2.561,00</PEAJEACSA>
<PEAJEURBANA>0,00</PEAJEURBANA>
<PEAJEINTERURBANA></PEAJEINTERURBANA>
<ESTACIONAMIENTO>1.800,00</ESTACIONAMIENTO>
</DETALLE>
<TOTAL>
<TOTAL_PEAJEACSA>2992</TOTAL_PEAJEACSA>
<TOTAL_PEAJEURBANAS>0</TOTAL_PEAJEURBANAS>
</TOTAL>
</DETCONSUMO2>
</DatosAdicionales>
</CtaCte><DTE>
_________________ JF^D Perl programming
|
2011-02-28 07:32 @355 |
|
|
mgonzalez
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 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. Using text Syntax Highlighting No se esperaba > en este momento. ¡¡Gracias!!
|
2011-02-28 07:45 @364 |
|
|
 |
explorer
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: Using bash Syntax Highlighting perl -00 -e "$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print" prueba.xml
_________________ JF^D Perl programming
|
2011-03-12 08:20 @389 |
|
|
l0g0s
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.
|
2011-03-12 10:23 @474 |
|
|
 |
explorer
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: Using perl Syntax Highlighting perl -00 -e "$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{<HISTOGRAMA></HISTOGRAMA>}gsix; print" prueba.xml
Esta es otra forma, un poco más corta: Using perl Syntax Highlighting perl -00 -e "$_ = <>; s{(<HISTOGRAMA>) .+? (</HISTOGRAMA>) \s*}{$1$2}gsix; print" prueba.xml
_________________ JF^D Perl programming
|
2011-03-12 12:21 @556 |
|
|
l0g0s
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!
|
2011-03-12 17:23 @766 |
|
|
 |
explorer
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  )
_________________ JF^D Perl programming
|
2011-03-27 11:16 @511 |
|
|
l0g0s
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!
|
2011-03-27 11:39 @527 |
|
|
 |
explorer
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: 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
|
| 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 |
 |
|