• 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.

Eliminar marca de un XML

Notapor mgonzalez » 2011-02-25 08:24 @391

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.
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Publicidad

Re: Eliminar marca de un XML

Notapor explorer » 2011-02-25 08:32 @397

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor mgonzalez » 2011-02-25 08:53 @411

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.
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Re: Eliminar marca de un XML

Notapor explorer » 2011-02-25 11:09 @506

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor explorer » 2011-02-25 11:25 @517

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor mgonzalez » 2011-02-25 11:40 @527

Sintáxis: [ Descargar ] [ Ocultar ]
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>[email protected]</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>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Por ejemplo, eliminar el tag <HISTOGRAMA>.

Gracias nuevamente.
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Re: Eliminar marca de un XML

Notapor explorer » 2011-02-25 12:27 @560

Bueno, siendo tan sencillo, se puede resolver en una sola línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -00 -e '$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print' fichero.xml
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
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>[email protected]</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>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor mgonzalez » 2011-02-28 07:32 @355

Un poco de paciencia, por favor.
Al ejecutar la línea

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -00 -e '$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print' prueba.xml
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
No se esperaba > en este momento.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¡¡Gracias!!
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Re: Eliminar marca de un XML

Notapor explorer » 2011-02-28 07:45 @364

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -00 -e "$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{}gsix; print" prueba.xml
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-03-12 08:20 @389

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.
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Siguiente

Volver a Intermedio

¿Quién está conectado?

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

cron