Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Usar TXMLDocument para Importar/Exportar datos (https://www.clubdelphi.com/foros/showthread.php?t=34446)

Durbed 09-08-2006 20:05:46

Usar TXMLDocument para Importar/Exportar datos
 
Nesito hacer una exportacion de informacion y su correspondiente importacion, y dada la estructura de la base de datos he visto que la mejor forma de realizar dichas operaciones seria mediante un fichero XML, el problema es que no encuentro ningun ejemplo donde explique como generar el fichero con varias capas y luego leerlo, el fichero que quiero generar es algo asi:

Código:

<contacto>
  <nombre>.....</nombre>
  <apellidos>.....</apellidos>
  ....

  <direcion>
    <calle>.....</calle>
    <numero>.....</numero>
    ...
    <telefono>
      <numero>.....</numero>
      <desc>.....</desc>
      ...
    </telefono>

    <telefono>
      <numero>.....</numero>
      <desc>.....</desc>
      ...
    </telefono>

    <telefono>
      <numero>.....</numero>
      <desc>.....</desc>
      ...
    </telefono>

    <email>
      <direccion>.....</direccion>
      <desc>.....</desc>
      ...
    </email>
  </direccion>
</contacto>

<contacto>
  ....
  <direccion>
    ....
    <telefono>
      ...
    </telefono>
    <telefono>
      ...
    </telefono>
  </direccion>
   
  <direccion>
    ....
    <telefono>
      ...
    </telefono>
    <email>
      ...
    </email>
  </direccion>
</contacto>

Para empezar creo que ese XML que quiero hacer esta mal, pero esa es la idea, teng que generar ese fichero y luego poder leerlo para sacar los datos referentes a los contactos.

Un saludo y gracias.

Durbed 10-08-2006 19:46:11

He conseguido leer dos niveles de profuncidad del XML, pero me falla al leer las direcciones del 2º contacto, alguien me puede ayudar, me falta una linea al salir del repeat de las direcciones.

Código Delphi [-]
procedure TForm1.btnRefreshClick(Sender: TObject);

var
  NContacto, NDireccion: IXMLNode;

begin
  XMLDoc.FileName := 'c:\ejemplo.xml';
  XMLDoc.Active:=True;

//Leo los contactos
  NContacto := XMLDoc.DocumentElement.ChildNodes.FindNode('contacto');
  NDireccion := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('dir');
  repeat
    LB1.Items.Add(NContacto.ChildNodes['nombre'].Text);
    LB1.Items.Add(NContacto.ChildNodes['direccion'].Text);
    LB1.Items.Add(NContacto.ChildNodes['telf'].Text);

    //Leo las Direcciones

    repeat
      LB1.Items.Add(NDireccion.ChildNodes['nombre'].Text);
      LB1.Items.Add(NDireccion.ChildNodes['direccion'].Text);
      LB1.Items.Add(NDireccion.ChildNodes['telf'].Text);

      NDireccion := NDireccion.NextSibling;
    Until NDireccion = nil;

    NContacto := NContacto.NextSibling;
  Until NContacto = nil;
end;

El codigo del XML que uso de prueba:
Código:

<?xml version="1.0" encoding="iso-8859-1"?>
<copia>
        <contacto>
                <nombre>NomCon 1</nombre>
                <direccion>DirCon 1</direccion>
                <telf>TelfCon 1</telf>
                <dir>
                        <nombre>Nom 1</nombre>
                        <direccion>Dir 1</direccion>
                        <telf>Telf 1</telf>
                </dir>
                <dir>
                        <nombre>Nom 2</nombre>
                        <direccion>Dir 2</direccion>
                        <telf>telf 2</telf>
                </dir>
        </contacto>

    <contacto>
            <nombre>NomCon 2</nombre>
        <direccion>DirCon 2</direccion>
        <telf>TelfCon 2</telf>
        <dir>
                <nombre>Nom 3</nombre>
                <direccion>Dir 3</direccion>
                <telf>telf 3</telf>
        </dir>
        <dir>
                <nombre>Nom 4</nombre>
                <direccion>Dir 4</direccion>
                <telf>Telf 4</telf>
        </dir>
    </contacto>
</copia>

A ver si postea alguien que no creo que sea el unico que se atreve con el XML.

Un saludo y gracias.

ACK 21-06-2007 09:22:00

Código Delphi [-]
//Leo los contactos
  NContacto := XMLDoc.DocumentElement.ChildNodes.FindNode('contacto');

  repeat
    memo1.Lines.Add( 'Contacto:' );
    memo1.lines.add( 'Nombre : ' + NContacto.ChildNodes['nombre'].Text );
    memo1.lines.add( 'Direccion : ' +  NContacto.ChildNodes['direccion'].Text);
    memo1.lines.add( 'Teléfono : ' + NContacto.ChildNodes['telf'].Text);

    //Leo las Direcciones
    NDireccion := NContacto.ChildNodes.FindNode('dir');
    repeat
      memo1.lines.add( 'Nombre : ' +  NDireccion.ChildNodes['nombre'].Text);
      memo1.lines.add( 'Direccion : ' + NDireccion.ChildNodes['direccion'].Text);
      memo1.lines.add( 'Teléfono : ' + NDireccion.ChildNodes['telf'].Text);

      NDireccion := NDireccion.NextSibling;
    Until NDireccion = nil;

    NContacto := NContacto.NextSibling;
  Until NContacto = nil;

b3nshi 11-08-2007 21:34:41

Se les ocurre alguna solucion?
 
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>
</Horario>
<Horario>Noche
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
</Dia>
<Dia>Martes
<Horario>Mañana</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Miercoles
<Horario>Mañana</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Jueves
<Horario>Mañana
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
<Horario>Tarde</Horario>
<Horario>Noche</Horario>
</Dia>
<Dia>Viernes
<Horario>Mañana
<Actividad>ir a un lugar</Actividad>
<Actividad>ir a un lugar</Actividad>
</Horario>
<Horario>Tarde</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 cargar la cantidad de actividades q deseen...
Y este es el codigo q estoy 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('agenda\' + 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 13-08-2007 19:07:39

Ya resolvi el problema!
 
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!

{Saludos}


La franja horaria es GMT +2. Ahora son las 07:26:58.

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