Página 1 de 3

Eliminar marca de un XML

NotaPublicado: 2011-02-25 08:24 @391
por mgonzalez
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.

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-25 08:32 @397
por explorer
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?

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-25 08:53 @411
por mgonzalez
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.

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-25 11:09 @506
por explorer
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.

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-25 11:25 @517
por explorer
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.

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-25 11:40 @527
por mgonzalez
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.005 segundos, usando GeSHi 1.0.8.4


Por ejemplo, eliminar el tag <HISTOGRAMA>.

Gracias nuevamente.

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-25 12:27 @560
por explorer
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

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-28 07:32 @355
por mgonzalez
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!!

Re: Eliminar marca de un XML

NotaPublicado: 2011-02-28 07:45 @364
por explorer
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

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-12 08:20 @389
por l0g0s
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.