Rep:Re: Parseo de arbol con tags

German Pizarro Binvignat gpizarro en iespana.es
Jue Feb 5 23:33:28 CLST 2004


-----Mensaje original-----
De: "Ricardo Muñoz A." <rmunoz en pjud.cl>
Para: Lista de desarrolladores en PHP <php en listas.inf.utfsm.cl>
Fecha: 31/01/04
Asunto: Re: Parseo de arbol con tags

On Fri, 30 Jan 2004 11:08:41 -0300
Bernardo Suarez <bsuarez en ebs.cl> wrote:

> Tengo que parsear un string y meterlo en una estructura más manejable.
> El problema es el formato... Ej:
> [{"nombre campo",valor},{nombre campo,[{nombre campo,valor},{nombre 
> campo,valor}]}]
> 
> El formato de este mensaje no lo puedo cambiar, por que lo genera una 
> aplicación propietaria.
> 
> Eso me define una estructura de árbol, y quiero guardarlo en un
arreglo 
> de arreglos, o mejor aún en un objeto. La estructura donde lo guardo
no 
> me complica tanto como el parseo.

Justo me toco hacer algo similar. la forma de hacerlo depende del método
que quieras ocupar

La idea es obtener una LISTA DE NODOS y parsearla en forma recursiva,
usando algo como

  for (int a = 0; a < Segmentos.getLength(); a++) {
          Node MySegmento = Segmentos.item(a);

          segment = segment.addChild(MySegmento.getNodeName());

          NodeList fields = MySegmento.getChildNodes();

          for (int b = 0; b < fields.getLength(); b++) {

            Node Myfield = fields.item(b);
            Node SEGMENT =
Myfield.getAttributes().getNamedItem("SEGMENT");

 NodeList ListaSegmentos = null;

          try {
            ListaSegmentos = XPathAPI.selectNodeList(MySegmento,
"*[@SEGMENT]");
          }
          catch (TransformerException ex) {
          }

          //aumenta el nivel de profundidad al entrar
          depth++;

          //"parsea" la lista
          parsingSegmentos(ListaSegmentos, segment, depth);

          //vuelve al nodo del cual salio
          segment = segment.getParent();
          //disminuye el nivel de profundidad al salir
          depth--;

El numero y el segmento adicional que se le entregan son para que sepa
en que nivel esta y con cual segmento trabajar.

Salu2

> 
> Se me habia ocurrido que puede no ser caro transformar eso (usando
algo 
> tan simple como replace) en xml y luego usar una clase como XPath para

> accesar los valores.
> 
> Si alguien tiene una idea mejor....
> 
> Gracias

quizas con expresiones regulares se podria hacer:

eregi("^[{\"([a-z]+)\",([1-9]+)},{([a-z]+),[{([a-z]+),([1-9]+)},{([a-z]+
),([1-9]+)}]}]",$mensaje,$arreglo)

luego obtienes los valores mediante $arreglo[1],$arreglo[2],etc.

más info en:
http://cl.php.net/manual/es/ref.regex.php

-- 
Ricardo Muñoz A. - rmunoz en pjud.cl
Usuario Linux #182825 (counter.li.org)

---Publicidad--------------------------------------------------------
Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar!
http://www.iespana.es/_reloc/email.meetic

---Publicidad--------------------------------------------------------
Juega con Ventura24.es, lotería inteligente y multiplica tus
posibilidades!! http://www.iespana.es/_reloc/email.ventura


---Publicidad--------------------------------------------------------
Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar!
http://www.iespana.es/_reloc/email.meetic