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