• Publicidad

Procesar XML poco común

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Procesar XML poco común

Notapor Skull118 » 2018-02-08 15:53 @703

Estimados, un gusto saludarles nuevamente.

Les comento que tengo un pequeño problema con un archivo XML. El mismo no es un archivo XML normal y/o habitual y no encuentro la forma de separar los segmentos "padre" de los "hijos" y "sub hijos" por lo que acudo a ustedes para que puedan indicarme si alguien conoce una vía más efectiva de hacer la lectura y procesamiento de datos.


El ejemplo de XML es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <!-- Arbol Padre -->
  2. <Decidir> Tipo de trafico
  3.         <!-- Arbol Hijo -->
  4.         <Decidir PorDefecto="si"> TValor
  5.                 <NodoTerminal atr="500">
  6.                 </NodoTerminal>
  7.         </Decidir>
  8.         <!-- Arbol Hijo -->
  9.         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="0" atr1="1"> Numero
  10.                 <!-- Arbol sub-hijo -->
  11.                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="3"> TT3
  12.                         <!-- Arbol sub-Hijo de hijo -->
  13.                         <Decidir PorDefecto="si"> TT
  14.                                 <NodoTerminal atr="502">
  15.                                 </NodoTerminal>
  16.                         </Decidir>
  17.                         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="A00"> Listas
  18.                                 <Decidir PorDefecto="si"> TT
  19.                                         <NodoTerminal atr="503">
  20.                                         </NodoTerminal>
  21.                                 </Decidir>
  22.                                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="0"> Grupos
  23.                                 </Decidir>
  24.                                 <Decidir PorDefecto="si"> TT
  25.                                         <NodoTerminal atr="520">
  26.                                         </NodoTerminal>
  27.                                 </Decidir>
  28.                         </Decidir>
  29.                 </Decidir>
  30.                 <Decidir PorDefecto="si"> TValor
  31.                         <NodoTerminal atr="500">
  32.                         </NodoTerminal>
  33.                 </Decidir>
  34.         </Decidir>
  35.         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="4"> Numero
  36.                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="3"> TT3
  37.                         <Decidir PorDefecto="si"> TT
  38.                                 <NodoTerminal atr="502">
  39.                                 </NodoTerminal>
  40.                         </Decidir>
  41.                         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="A00"> Listas
  42.                                 <Decidir PorDefecto="si"> TT
  43.                                         <NodoTerminal atr="503">
  44.                                         </NodoTerminal>
  45.                                 </Decidir>
  46.                                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="0"> Grupos
  47.                                 </Decidir>
  48.                         </Decidir>
  49.                         <Decidir PorDefecto="si"> TT
  50.                                 <NodoTerminal atr="520">
  51.                                 </NodoTerminal>
  52.                         </Decidir>
  53.                 </Decidir>
  54.         </Decidir>
  55. </Decidir>
  56.  
Coloreado en 0.015 segundos, usando GeSHi 1.0.8.4



Del archivo debería poder filtrar por los primeros atr0 o atr1 que aparecen en los árboles Hijo; posteriormente filtrar los atr0 en los árboles sub-hijo y obtener el atr (que es lo que más me interesa) del último sub-hijo de hijo. Lo he tratado de especificar en el archivo tan claro como he podido.

Cabe mencionar que el archivo XML puede tener varios árboles de sub-hijos y también varios árboles de hijos de sub-hijos y dentro ellos más árboles probablemente.

No sé si exista algún módulo que pueda ayudarme en esto, o si deberé procesar el archivo haciendo un script a la medida para ello.

De antemano, muchas gracias a todos.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 52
Registrado: 2013-03-21 13:38 @610

Publicidad

Re: Procesar XML poco común

Notapor explorer » 2018-02-08 20:31 @896

Esto no es XML ni nada... es puro texto descolocado.

A quien se le haya ocurrido este formato deberían despedirle pero ya.

No creo que te sirva ninguno de los más de 200 módulos para XML que hay en Perl. Casi todos dependen de que esté bien formado, y además, veo que en el contenido entre marcas está mezclando texto junto con otras marcas... ¡Vaya desastre!

No sé... quizás se pueda resolver con expresiones regulares.

¿Algún voluntario?
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14124
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar XML poco común

Notapor Skull118 » 2018-02-09 09:25 @434

Lo que me temía, tendré que hacerlo todo en base a regex, muchas gracias por tu confirmación.

Saludos
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 52
Registrado: 2013-03-21 13:38 @610

Re: Procesar XML poco común

Notapor explorer » 2018-02-10 10:45 @490

Una pregunta: ¿el código que has puesto es correcto? Lo digo porque al final faltan 4 marcas '</Decidir>'. Sin ellas, el procesamiento se vuelve una locura.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14124
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar XML poco común

Notapor Skull118 » 2018-02-14 10:29 @479

explorer, código corregido.


Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1.  
  2. <!-- Arbol Padre -->
  3. <Decidir> Tipo de trafico
  4.  
  5.         <!-- Arbol Hijo -->
  6.         <Decidir PorDefecto="si"> TValor
  7.  
  8.                 <NodoTerminal atr="500">
  9.  
  10.                 </NodoTerminal>
  11.  
  12.         </Decidir>
  13.  
  14.         <!-- Arbol Hijo -->
  15.         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="0" atr1="1"> Numero
  16.  
  17.  
  18.                 <!-- Arbol sub-hijo -->
  19.                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="3"> TT3
  20.  
  21.                         <!-- Arbol sub-Hijo de hijo -->
  22.                         <Decidir PorDefecto="si"> TT
  23.  
  24.                                 <NodoTerminal atr="502">
  25.                                 </NodoTerminal>
  26.  
  27.                         </Decidir>
  28.  
  29.                         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="A00"> Listas
  30.  
  31.                                 <Decidir PorDefecto="si"> TT
  32.  
  33.                                         <NodoTerminal atr="503">
  34.                                         </NodoTerminal>
  35.  
  36.                                 </Decidir>
  37.  
  38.                                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="0"> Grupos
  39.                         </Decidir>
  40.                          
  41.  
  42.                                         <Decidir PorDefecto="si"> TT
  43.                                                 <NodoTerminal atr="520">
  44.                                                 </NodoTerminal>
  45.                                         </Decidir>
  46.                                        
  47.                                 </Decidir>
  48.                 </Decidir>
  49.  
  50.                 <Decidir PorDefecto="si"> TValor
  51.                                 <NodoTerminal atr="500">
  52.                                </NodoTerminal>
  53.                 </Decidir>
  54.  
  55.                 </NodoTerminal>
  56.  
  57.         </Decidir>
  58.  
  59.         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="4"> Numero
  60.                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="3"> TT3
  61.  
  62.                         <Decidir PorDefecto="si"> TT
  63.  
  64.                                 <NodoTerminal atr="502">
  65.                                 </NodoTerminal>
  66.  
  67.                         </Decidir>
  68.  
  69.                         <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="A00"> Listas
  70.                        
  71.  
  72.                                 <Decidir PorDefecto="si"> TT
  73.  
  74.                                         <NodoTerminal atr="503">
  75.                                         </NodoTerminal>
  76.  
  77.                                 </Decidir>
  78.  
  79.                                 <Decidir PorDefecto="no" TipoCondicion="Conjunto" atr0="0"> Grupos
  80.                         </Decidir>
  81.                                 </Decidir>
  82.  
  83.  
  84.                                         <Decidir PorDefecto="si"> TT
  85.                                                 <NodoTerminal atr="520">
  86.                                                 </NodoTerminal>
  87.                                         </Decidir>
  88.                                        
  89.                                 </Decidir>
  90.                 </Decidir>
  91.         </Decidir>
  92. <Decidir>
  93.  
  94.  
Coloreado en 0.017 segundos, usando GeSHi 1.0.8.4
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 52
Registrado: 2013-03-21 13:38 @610

Re: Procesar XML poco común

Notapor explorer » 2018-02-14 11:46 @532

Pues... me parece que no...

Hay una marca </NodoTerminal> huérfana en la línea 55.

La línea 92 tiene una marca de apertura, no de cierre.

He editado el primer mensaje (fíjate que hay botones de Editar en cada mensaje) y he puesto lo que creo que debe ser lo correcto.

Repito que si el XML llega mal, los problemas son mucho mayores. Otra cosa, ¿Los comentarios <!-- --> los has puesto tú?

Te ruego que pongas un ejemplo pero lo más cercano a la realidad con la que quieres trabajar. Si no, no podremos ayudarte. Como supongo que debes tener algún archivo de ejemplo con el que estés trabajando, puedes adjuntarlo al mensaje. O un copia y pega, pero que sea literal, dejando los espacios y demás caracteres especiales que traiga, y ofuscas la información sensible.

Si el texto a tratar "se parece" mucho a un XML, aún hay esperanzas de tratarlo de forma cómoda.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14124
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado