Página 1 de 1

Procesar XML poco común

NotaPublicado: 2018-02-08 15:53 @703
por Skull118
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.067 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.

Re: Procesar XML poco común

NotaPublicado: 2018-02-08 20:31 @896
por explorer
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?

Re: Procesar XML poco común

NotaPublicado: 2018-02-09 09:25 @434
por Skull118
Lo que me temía, tendré que hacerlo todo en base a regex, muchas gracias por tu confirmación.

Saludos

Re: Procesar XML poco común

NotaPublicado: 2018-02-10 10:45 @490
por explorer
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.

Re: Procesar XML poco común

NotaPublicado: 2018-02-14 10:29 @479
por Skull118
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

Re: Procesar XML poco común

NotaPublicado: 2018-02-14 11:46 @532
por explorer
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.