PDA

Ver la Versión Completa : Procesar Archivos XML en Delphi 7


nlsgarcia
15-10-2012, 05:05:48
Hola:

¿Como puedo en Delphi 7 leer y generar archivos en formato XML?

Agradezco información y ejemplos sobre el componente XMLDocument de Delphi 7 o cualquier otro componente o clase XML que ustedes consideren importante.

Gracias de antemano :)

Saludos,

Nelson

Neftali [Germán.Estévez]
15-10-2012, 11:06:01
Busca también sobre la herramienta XMLMapper que viene con delphi. Si revisas esta entrada verás un ejemplo (http://neftali.clubdelphi.com/?p=1245) de utilización.

nlsgarcia
15-10-2012, 20:59:10
Neftali,

Gracias por la información de XMLMapper :)

¿Tendras algún ejemplo del Componente XMLDocument de Delphi 7?

Nelson

nlsgarcia
16-10-2012, 06:54:14
Hola:

Este es un ejemplo autoexplicativo de como Leer y Generar archivos en formato XML con Delphi 7 por medio del componente XMLDocument creado de forma dinámica:


unit Unit26;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc;

type
TForm26 = class(TForm)
ListBox1: TListBox;
GroupBox1: TGroupBox;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form26: TForm26;

implementation

{$R *.dfm}

// Crea un archivo XML : Document_File_XML
procedure TForm26.Button1Click(Sender: TObject);
var
XML : TXMLDocument;
ChildNode : IXMLNode;
i, j : Integer;
begin
XML := TXMLDocument.Create(nil);
try
XML.Active := true;
// Crea el cuerpo princial del documento XML
XML.AddChild('Document_File_XML');

for i := 1 to 3 do
begin
// Crea el Nodo Raiz o Registro
ChildNode := XML.DocumentElement.AddChild('Root_Node-' + IntToStr(i));
for j:=1 to 3 do
// Crea el Nodo Hijo o Campo del Registro
ChildNode.AddChild('Child_Node-' + IntToStr(j)).text := 'TextChild-' + IntToStr(i) + IntToStr(j);
end;

// Identa el Documento XML
XML.XML.Text := xmlDoc.FormatXMLData(XML.XML.Text);

XML.Active := true;

// Salva el archivo creado
XML.SaveToFile('Document_File_XML.xml');

XML.Active := False;

finally
XML := nil;
end;
end;

// Lee un archivo XML : Document_File_XML
procedure TForm26.Button2Click(Sender: TObject);
var
XML : TXMLDocument;
ChildNode : IXMLNode;
i,j : Integer;
begin
ListBox1.Clear;
XML := TXMLDocument.Create(Self);
try
XML.Active := True;

// Carga el archivo creado
XML.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Document_File_XML.xml');

// Lee todos los Nodos o Registros
for i:= 0 to XML.DocumentElement.ChildNodes.Count - 1 do
begin
// Lee un Nodo o Registro
ChildNode := XML.DocumentElement.ChildNodes[i];
for j:= 1 to 3 do
// Lee cada Nodo Hijo o Campo del registro
ListBox1.Items.Add(ChildNode.ChildNodes['Child_Node-' + IntToStr(j)].Text);
end;
XML.Active := False;
finally
XML := nil;
end;
end;

end.




// Archivo Document_File_XML Creado y Leído por las rutinas anteriores
<Document_File_XML>
<Root_Node-1>
<Child_Node-1>TextChild-11</Child_Node-1>
<Child_Node-2>TextChild-12</Child_Node-2>
<Child_Node-3>TextChild-13</Child_Node-3>
</Root_Node-1>
<Root_Node-2>
<Child_Node-1>TextChild-21</Child_Node-1>
<Child_Node-2>TextChild-22</Child_Node-2>
<Child_Node-3>TextChild-23</Child_Node-3>
</Root_Node-2>
<Root_Node-3>
<Child_Node-1>TextChild-31</Child_Node-1>
<Child_Node-2>TextChild-32</Child_Node-2>
<Child_Node-3>TextChild-33</Child_Node-3>
</Root_Node-3>
</Document_File_XML>
Se agradece cualquier información adicional sobre el Componente XMLDocument :)

Espero sea de utilidad este sencillo ejemplo genérico el cual puede ser adaptado a situaciones particulares

Nelson

nnebli
16-10-2012, 23:27:37
Voy a buscar lo que tengo sobre los XML y lo subo.

Intentaré recopilar lo que tengo mañana.

Saludos.

nlsgarcia
18-10-2012, 23:49:23
Hola:

En este link : http://delphi.about.com/od/internetintranet/ss/xml_rss_read_3.htm hay un ejemplo completo y descargable de como leer una pagina web en formato XML (RSS Feeds) con la clase TXMLDocument el cual es aplicable a cualquier otro archivo XML.

Usa otros metodos de lectura del archivo XML de los previamente comentados que son muy interesantes y autoexplicativos :)

Anexo parte del ejemplo de la pagina citada en el link:

var
StartItemNode : IXMLNode;
ANode : IXMLNode;
STitle, sDesc, sLink : WideString;
begin
...
//points to local XML file in "original" code
XMLDoc.FileName := 'http://0.tqn.com/6/g/delphi/b/index.xml';
XMLDoc.Active:=True;

StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item') ;

ANode := StartItemNode;
repeat
STitle := ANode.ChildNodes['title'].Text;
sLink := ANode.ChildNodes['link'].Text;
sDesc := ANode.ChildNodes['description'].Text;

//add to list view
with LV.Items.Add do
begin
Caption := STitle;
SubItems.Add(sLink) ;
SubItems.Add(sDesc)
end;

ANode := ANode.NextSibling;
until ANode = nil;

Espero sea útil :)

Nelson.

nnebli
20-10-2012, 07:20:43
Ante todo pido disculpas por no cumplir lo dicho, no ha sido mi intención. A veces hay más cosas que hacer de las que se pueden y no he podido subir la informaición que tegon yo sobre los XML.

Esto es con lo que yo estoy trabajando y me ha servido para crear XML más o menos complejos:

Nota: Te creas una ficha (un nuevo poyecto) y en ella pones varios botones para llamar a los procedimientos que se indican: Button2Click, Button3Click, etc. Copiando lo que ponen estos procedimientos te debería funcionar. Te pego el pequeño programilla que tengo de ejemplo, copia lo que necesites dentro de tu Forn: (si tienes cualquier duda, lo dices, intentaré ir viendo si hay dudas).

Para ir comprobando como funciona, ves en orden, ejecuta primero: Button2Click y luego el resto, ya que de lo contrario, lo mismo trata de leer un archivo XML que no existe y te dará error.

Saludos. Espero que te sea de utilidad. (Yo trabajo con Delphi 7)


unit UGeneraFicherosEnXML;
interface
uses
XMLDoc,XMLIntf,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBClient, xmldom, msxmldom, ExtCtrls;
type
TGeneraFicherosEnXML = class(TForm)
Button2: TButton;
XMLDocument1: TXMLDocument;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Bevel1: TBevel;
Label2: TLabel;
Label1: TLabel;
Bevel2: TBevel;
Button1: TButton;
procedure TeclaPulsada(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
GeneraFicherosEnXML: TGeneraFicherosEnXML;

implementation
{$R *.dfm}

procedure TGeneraFicherosEnXML.TeclaPulsada(Sender: TObject; var Key: Char);
begin
If Key = #27 Then Close;
end;

procedure TGeneraFicherosEnXML.Button2Click(Sender: TObject);
var
archivoXML: TXMLDocument;
Nodo,NDatosGenerales,NMensajeFacturacion,NCabecera,NDatosFinales : IXMLNode;
begin
archivoXML := TXMLDocument.Create(Application);
try
// Activamos el archivo XML
archivoXML.Active := True;
archivoXML.Version:='1.0';
archivoXML.Encoding:='UTF-8';

// Creamos el elemento principal: EsteEsElementoPrincipal //
NMensajeFacturacion := archivoXML.AddChild('EsteEsElementoPrincipal');
NMensajeFacturacion.Attributes['Firmar'] := 'NO';

// Ponemos el elemento que denominamos: Cabecera //
NCabecera := NMensajeFacturacion.AddChild( 'Cabecera' );
// ponemos elementos hijos del anterior que era 'Cabecera'
Nodo := NCabecera.AddChild( 'FechaSolicitud' );
Nodo.Text := '2012-09-08T11:57:31+01:00';
Nodo := NCabecera.AddChild( 'Version' );
Nodo.Text := '02';

// Ponemos el elemento: DatosGenerales - Dentro del elemento Cabecera
NDatosGenerales := NCabecera.AddChild( 'DatosGenerales' );
Nodo := NDatosGenerales.AddChild( 'Calle' );
Nodo.Text := 'Del río, 3';
Nodo := NDatosGenerales.AddChild( 'Municipio' );
Nodo.Text := 'Fuenlabrada';

// Ponemos el elemento: DatosFinales //
NDatosFinales := NMensajeFacturacion.AddChild( 'DatosFinales' );
// ponemos elementos hijos del anterior que era 'DatosFinales'
Nodo := NDatosFinales.AddChild( 'Enviado' );
Nodo.Text := '2012-09-08';
Nodo := NDatosFinales.AddChild( 'ConfirmacionRecepcion' );
Nodo.Text := 'SI';

// guardamos los datos del fichero con el nombre indicado
archivoXML.SaveToFile(ExtractFilePath(Application.ExeName) + 'Fichero en XML de prueba.xml');

finally
archivoXML.Free;
end;

end;
procedure TGeneraFicherosEnXML.Button3Click(Sender: TObject);
var
Cliente: IXMLNode;
begin
// LEYENDO EL VALOR DE LOS NODOS
XMLDocument1.LoadFromFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );
XMLDocument1.Active := True;
Cliente := XMLDocument1.DocumentElement.ChildNodes[0];
ShowMessage( Cliente.ChildNodes['FechaSolicitud'].Text );
end;
procedure TGeneraFicherosEnXML.Button4Click(Sender: TObject);
var
Cliente: IXMLNode;
begin
// MODIFICANDO EL VALOR DE LOS NODOS
XMLDocument1.LoadFromFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );
XMLDocument1.Active := True;
Cliente := XMLDocument1.DocumentElement.ChildNodes[0];
Cliente.ChildNodes['FechaSolicitud'].Text := 'Nueva fecha 19-10-2012';
XMLDocument1.SaveToFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );
end;

procedure TGeneraFicherosEnXML.Button5Click(Sender: TObject);
var
Cliente, Nodo: IXMLNode;
begin
// AÑADIENDO NODOS
XMLDocument1.LoadFromFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );
XMLDocument1.Active := True;
Cliente := XMLDocument1.DocumentElement.AddChild( 'EsteNodoHaSidoAnnadido' );
Nodo := Cliente.AddChild( 'NuevoNodoAnnadido' );
Nodo.Text := 'Datos annadidos 1';
Nodo := Cliente.AddChild( 'FechaAnnadido' );
Nodo.Text := '19-10-2012';
XMLDocument1.SaveToFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );

end;

procedure TGeneraFicherosEnXML.Button6Click(Sender: TObject);
begin
// BORRANDO NODOS
XMLDocument1.LoadFromFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );
XMLDocument1.Active := True;
XMLDocument1.DocumentElement.ChildNodes.Delete( 0 );
XMLDocument1.SaveToFile( ExtractFilePath( Application.ExeName ) + 'Fichero en XML de prueba.xml' );

end;

procedure TGeneraFicherosEnXML.Button1Click(Sender: TObject);
begin
Close;
end;

end.

Casimiro Notevi
20-10-2012, 10:11:58
..

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

nlsgarcia
20-10-2012, 20:56:08
nnebli,

Gracias, muy interesante el ejemplo :)

Nelson.