Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer XML - error? (https://www.clubdelphi.com/foros/showthread.php?t=46839)

b3nshi 10-08-2007 23:47:00

Leer XML - error?
 
Bueno esta es la estructura del archivo xml q estoy queriendo leer:
Código:

<?xml version="1.0"?>
<Agenda>
<Dia>Lunes
<Horario>Mañana</Horario>
<Horario>Tarde
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Martes
<Horario>Mañana</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Miercoles
<Horario>Mañana
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
<Horario>Tarde</Horario>
<Horario>Noche
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
</Dia>
<Dia>Jueves
<Horario>Mañana</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Viernes
<Horario>Mañana</Horario>
<Horario>Tarde
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Sabado
<Horario>Mañana</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Domingo
<Horario>Mañana</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
</Agenda>

En cada horario pueden haber diferente cantidad de actividades guardadas...
Y este es el codigo q esoty implementando para ello... pero me aparece un error... al parecer es donde lo indico, pero no se porq...
Código Delphi [-]
//prodecimiento
var
h,d,j,i : integer;
nhorario: ttreenode;
ndia, nhor, nsec: IXMLNode;
const
dias : array [0..6] of string =  ('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo');
hora : array [0..2] of string =  ('Mañana','Tarde','Noche');

{bueno primero cargo el documento}
xml1.loadfromfile('planes\' + enom.Text +'.lp');
//xml1.FileName := 'planes\' + enom.Text +'.lp';
xml1.Active := true;
{ahora tengo q empezar a leer}
d:= 0;
h:= 0;
  repeat//Para los dias
  ndia := xml1.DocumentElement.ChildNodes.First.ChildNodes.FindNode('Dia');
  nhor := ndia.ChildNodes.findnode('Horario'); //AQUI ESTA EL PROBLEMA
    repeat//este es para el horario
              //Aqui coloco un for para ir cargando en el treeview
              //Recorro todo el treeview
              for i := 0 to actividad.Items.Count - 1 do
                begin
                  if uppercase(trim(actividad.Items[i].Text)) = uppercase(trim(dias[d])) then
                    begin
                       for j := 0 to actividad.items[i].Count - 1 do
                          begin
                             if uppercase(trim(actividad.Items[i + j].Text)) = uppercase(trim(hora[h])) then
                               begin
                                 nhorario := actividad.Items[i + j];
                                 actividad.Items.AddChild(nhorario,nhor.ChildNodes['Actividad'].Text);
                               end;
                           end;
                       end;
                   end;//Fin del for principal

    h := h+1;
    nhor := nhor.NextSibling; //Avanzo al siguiente horario
    until  nhor = nil; //Repeat  de los horarios
  
  d := d+1; //Para moverme en el array de los dias
  ndia := ndia.NextSibling; //avanzo al siguiente dia
  until ndia = nil; //Este es el repeat de los dias
xml1.Active := false;
end;

Lo que intento hacer es cargar en un treeview q se llama "actividad" Tengo q aclarar q ese treeview ya tiene cargado los dias y los horarios... solo resta cargarle las actividades en sus respectivos horarios...

Espero q alguien pueda ayudarme... muchisimas gracias!

{Saludos}

b3nshi 11-08-2007 21:23:28

Por favor ayuda!
 
No puedo resolver el problema... le estoy dando vueltas al asunto y nada... no consigo hacerlo... por favor si a alguien se le ocurre como hacerlo le agradeceria muchisimo...

{Saludos}

b3nshi 13-08-2007 19:11:55

Solucionado!!
 
Gracias de todos modos... y bueno... les cuento q hice para solucionarlo si?

Empecé por guardarlo de otra forma al archivo xml... usando la propiedad attributes de los nodos... por lo que mi archivo quedo mucho mas elegante... por asi decirlo... y bueno utilice este codigo para abrirlo ;)

Código Delphi [-]
xml1.loadfromfile('agenda\' + enom.Text +'.ext');
xml1.Active := true;
ndia := xml1.DocumentElement.ChildNodes.FindNode('Dia');
repeat
  //Agrego al tree view
  ntdia := agenda.Items.Addchild(nil,ndia.Attributes['Text']);
  nhor := ndia.childnodes.FindNode('Horario');
      repeat
      nthor := agenda.Items.AddChild(ntdia,nhor.Attributes['Text']);
      nact := nhor.ChildNodes.FindNode('Actividad');
      if nact <> nil then
       repeat
       ntact := agenda.Items.AddChild(nthor,nact.Attributes['Text']);
       //Agrego al tree view
       nact := nact.NextSibling;
       until nact = nil ;
       nhor := nhor.NextSibling;
      until nhor = nil;
    //STitle := ANode.ChildNodes['title'].Text;
  ndia := ndia.NextSibling;
until ndia = nil  ;
xml1.Active := false;

Aclaro q esta solucion la encontre yo... y puede haber otra mejor de leer los datos... lei de muchos lugares muchos metodos... e inclusive con otros componentes q facilitan mucho el manejo... pero por una cuestion de q utilizo Turbo Delphi no puedo instalar componentes... y ademas para ahorrarme problemas con licencias prefiero usar componentes delphi...

El problema aparentemente era porq no encontraba ese nodo, pero una vez encontrado el problema aparecia en las actividades y era debido a que podia o no haber una actividad cargada en el horario y bueno... una vez validado eso no hubo problemas...

Les agradezco a aquellos quienes hayan intentado encontrar la solucion!
Y gracias al mismo tiempo porq aprendi mucho resolviendolo!

Por cierto! Casi me vuelvo loco... jajaj...

{Saludos}

jhonny 13-08-2007 19:33:33

Que bueno, que hayas encontrado la solución y que ademas la hayas compartido con nosotros, pero me quedaron unas dudas...

Haz dicho esto...

Empecé por guardarlo de otra forma al archivo xml... usando la propiedad attributes de los nodos... por lo que mi archivo quedo mucho mas elegante... por asi decirlo...

¿Cuales fueron y de que componente eran esos atributos, del TXMLDocument o del TTreeview? y otra duda ¿Podrias mostrarnos como quedo tu archivo XML?

Bueno, me interese por este tema y aunque no logre aportarte nada al respecto, realmente me interesa saber como quedaron esos asuntitos :D.

Por tu tiempo y conocimientos prestados, muchisimas gracias :)

b3nshi 13-08-2007 20:13:16

jaja... la verdad q me exprese muy mal y no explique muy bien... en realidad no se si estare hablando con propiedad... desde mi ignorancia voy a tratar de explicar la diferencia entre el archivo de antes y el de ahora...

Primero... use un componente Txmldocument para crear, modificar y abrir archivos xml... y bueno... un componente treeview para verlo...

En mi caso... yo creaba un treeview con estos datos:
dia
-->horario
------->Actividad

Siendo dia... los 7 dias de la semana... y horario (mañana, tarde y noche) y estos datos no podian variar en mi treeview, pero el dato q si podia variar era actividad... ya q podia cargar 0 - 1 o 5 actividades en un horario...

Para crear el fichero utilice este codigo... no es sacado de ningun lugar... lo hice yo con la ayuda de caro y roman para moverme en el treeview. Y bueno... lei bastante sobre archivos xml...

Aqui el codigo
xml1 es el componente Txmldocument
agenda es el componente Treeview
Código Delphi [-]
var
i: integer;
ndia, nage, nhor, nact: IXMLNode;
begin
{Guardo la actividad}
  xml1.filename := ''; //porq uso el mismo componente para abrir, se puede crear en tiempo de ejecucion y este problema no apareceria
 xml1.Active := True;
  //Ahora si creo el xml
  xml1.Version := '1.0';
 nage := Xml1.AddChild('Agenda');
 for i := 0 to agenda.Items.Count - 1 do
   begin
       case plan.Items[i].Level of
         0:begin ndia := nage.AddChild('Dia'); ndia.Attributes['Text']:= agenda.Items[i].Text; end;
         1:begin nhor := ndia.AddChild('Horario'); nhor.Attributes['Text'] := agenda.Items[i].Text;end;
         2:begin nact := nhor.AddChild('Actividad'); nact.Attributes['Text'] := agenda.items[i].Text; end;
        end;
   end; //Fin del for
  //ahora si guardo el archivo xml
  xml1.SaveToFile('agenda\' + trim(enom.text) + '.ext');
  xml1.active:= false;
end; //Fin del procedimiento q crea el fichero
Y asi quedo guardado el archivo XML...
Código:

<?xml version="1.0"?>


<Agenda>
<Dia Text="Lunes"><Horario Text="Mañana"><Actividad Text="La actividad"/></Horario><Horario Text="Tarde"/></Horario><Horario Text="Noche"/></Dia>
<Dia Text="Martes"><Horario Text="Mañana"></Horario><Horario Text="Tarde"/><Actividad Text="La actividad"/></Horario><Horario Text="Noche"/></Dia>
<Dia Text="Miercoles"><Horario Text="Mañana"><Actividad Text="La actividad"/></Horario><Horario Text="Tarde"/></Horario><Horario Text="Noche"/><Actividad Text="La actividad"/></Dia>
<Dia Text="Jueves"><Horario Text="Mañana"><Actividad Text="La actividad"/></Horario><Horario Text="Tarde"/></Horario><Horario Text="Noche"/></Dia>
<Dia Text="Viernes"><Horario Text="Mañana"><Actividad Text="La actividad"/></Horario><Horario Text="Tarde"/></Horario><Horario Text="Noche"/></Dia>
<Dia Text="Sabado"><Horario Text="Mañana"></Horario><Horario Text="Tarde"/><Actividad Text="La actividad"/></Horario><Horario Text="Noche"/></Dia></Dia>
<Dia Text="Domingo"><Horario Text="Mañana"><Actividad Text="La actividad"/></Horario><Horario Text="Tarde"/></Horario><Horario Text="Noche"/></Dia></Agenda>

En cuanto al codigo para abrir el archivo y mostrarlo en el treeview es este:
Código Delphi [-]
xml1.loadfromfile('agenda\' + enom.Text +'.ext');
xml1.Active := true;ndia := xml1.DocumentElement.ChildNodes.FindNode('Dia');
repeat  //Agrego al tree view  
 ntdia := agenda.Items.Addchild(nil,ndia.Attributes['Text']);
 nhor := ndia.childnodes.FindNode('Horario');      
   repeat      
      nthor := agenda.Items.AddChild(ntdia,nhor.Attributes['Text']);      
      nact := nhor.ChildNodes.FindNode('Actividad');      
        if nact <> nil then      
            repeat       
              ntact := agenda.Items.AddChild(nthor,nact.Attributes['Text']);
              //Agrego al tree view  
              nact := nact.NextSibling;       
            until nact = nil ; 
      nhor := nhor.NextSibling;
   until nhor = nil; 
ndia := ndia.NextSibling;
until ndia = nil  ;
xml1.Active := false;
En el caso de crear el componente Txmldocument en tiempo de ejecucion al final se debe dar el valor de nil...
Código Delphi [-]
xml1 := nil;

Y bueno... creo q eso seria todo... cualquier duda sigo leyendo y aprendiendo por lo q quizas pueda ayudar mas...

{Saludos}

jhonny 13-08-2007 20:22:46

Pues de nuevo gracias, ahora a ensayar y a ver que tal esta la cosa :)

b3nshi 13-08-2007 20:37:45

No hay porq agradecer... :D siempre soy yo el que pide ayuda!

Suerte!

{Saludos}


La franja horaria es GMT +2. Ahora son las 05:48:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi