Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-08-2006
Avatar de Durbed
Durbed Durbed is offline
Miembro
 
Registrado: ago 2004
Posts: 166
Poder: 20
Durbed Va por buen camino
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.
__________________
Intentando hacer algo con Delphi 7 y Firebird 1.5
Responder Con Cita
  #2  
Antiguo 10-08-2006
Avatar de Durbed
Durbed Durbed is offline
Miembro
 
Registrado: ago 2004
Posts: 166
Poder: 20
Durbed Va por buen camino
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.
__________________
Intentando hacer algo con Delphi 7 y Firebird 1.5

Última edición por Durbed fecha: 10-08-2006 a las 20:49:18.
Responder Con Cita
  #3  
Antiguo 21-06-2007
Avatar de ACK
ACK ACK is offline
Miembro
 
Registrado: jun 2003
Ubicación: Castellón
Posts: 27
Poder: 0
ACK Va por buen camino
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;
Responder Con Cita
  #4  
Antiguo 11-08-2007
Avatar de b3nshi
b3nshi b3nshi is offline
Miembro
 
Registrado: feb 2005
Ubicación: Tucuman - Argentina
Posts: 164
Poder: 20
b3nshi Va por buen camino
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}

Última edición por b3nshi fecha: 13-08-2007 a las 20:08:49.
Responder Con Cita
  #5  
Antiguo 13-08-2007
Avatar de b3nshi
b3nshi b3nshi is offline
Miembro
 
Registrado: feb 2005
Ubicación: Tucuman - Argentina
Posts: 164
Poder: 20
b3nshi Va por buen camino
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}
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
exportar/importar listview a excel weke Servers 8 18-08-2013 10:38:06
Exportar/Importar y Sincronizar dos bases Durbed Conexión con bases de datos 2 21-07-2006 13:23:08
PHP: Importar / Exportar Mysql dmassive PHP 5 21-01-2006 02:16:25
Exportar e Importar Datos santi33a MS SQL Server 16 09-01-2006 22:55:12
Exportar e importar campos memo a otro gdb eliasterrero Firebird e Interbase 0 15-03-2005 14:27:07


La franja horaria es GMT +2. Ahora son las 13:55:06.


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
Copyright 1996-2007 Club Delphi