Ver Mensaje Individual
  #5  
Antiguo 25-04-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
arturom,

Cita:
Empezado por arturom
...tengo que descargar un archivo XML de internet...extraer una serie de datos...y crear un archivo de texto plano...El problema es que el archivo XML no es consistente en la cantidad de campos que almacena de cada registro...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

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

const
   FileNameXML = 'File_FileName.xml';
   FileNameTXT = 'File_FileName.txt';
   FieldFrom = 1; // Mínima cantidad de campos del archivo XML
   FieldTo = 5;   // Máxima cantidad de campos del archivo XML

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Crea un archivo XML
procedure TForm1.Button1Click(Sender: TObject);
var
   XML : TXMLDocument;
   ChildNode : IXMLNode;
   i, j : Integer;

begin

   Randomize;

   XML := TXMLDocument.Create(nil);

   SetCurrentDir(ExtractFilePath(Application.ExeName));

   try

      XML.Active := true;

      // Crea el cuerpo princial del documento XML
      XML.AddChild('Document_File_XML.xml');

      for i := 1 to 3 do
      begin
         // Crea el Nodo Raíz o Registro
         ChildNode := XML.DocumentElement.AddChild('Root_Node-' + IntToStr(i));
         for j:= 1 to RandomRange(FieldFrom,FieldTo+1) do  // Genera N Nodos Hijos o Campos del Archivo XML de forma Aleatoria
            // Crea el Nodo Hijo o Campo del Registro
            ChildNode.AddChild('Child_Node-' + IntToStr(j)).text := 'Node-' + IntToStr(i) + ' TextChild-' + IntToStr(j);
      end;

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

      XML.Active := true;

      // Salva el archivo creado
      XML.SaveToFile(FileNameXML);

      XML.Active := False;

   finally

      XML := nil;

   end;

end;

// Lee un archivo XML
procedure TForm1.Button2Click(Sender: TObject);
var
   XML : TXMLDocument;
   RootNode : IXMLNode;
   i,j : Integer;

begin

   ListBox1.Clear;

   SetCurrentDir(ExtractFilePath(Application.ExeName));

   XML := TXMLDocument.Create(Self);

   try

      XML.Active := True;

      // Carga el archivo XML creado
      XML.LoadFromFile(FileNameXML);

      // Lee todos los Nodos o Registros
      ListBox1.Items.Add(StringOfChar('-',10));

      for i:= 0 to XML.DocumentElement.ChildNodes.Count - 1 do
      begin
         // Lee un Nodo o Registro
         RootNode := XML.DocumentElement.ChildNodes[i];
         for j:= 0 to RootNode.ChildNodes.Count - 1 do
            // Lee cada Nodo Hijo o Campo del registro
            ListBox1.Items.Add(RootNode.ChildNodes.Nodes[j].Text);
         ListBox1.Items.Add(StringOfChar('-',10));
      end;

      XML.Active := False;

   finally

      XML := nil;

   end;

end;

// Crea un archivo TXT en base a un archivo XML
procedure TForm1.Button3Click(Sender: TObject);
var
   XML : TXMLDocument;
   RootNode : IXMLNode;
   i,j : Integer;
   F : TextFile;
   Buffer : String;

begin

   SetCurrentDir(ExtractFilePath(Application.ExeName));

   XML := TXMLDocument.Create(Self);

   try

      FileMode := fmOpenWrite;
      AssignFile(F, FileNameTXT);
      Rewrite(F);

      XML.Active := True;

      // Carga el archivo XML creado
      XML.LoadFromFile(FileNameXML);

      // Lee todos los Nodos o Registros
      for i:= 0 to XML.DocumentElement.ChildNodes.Count - 1 do
      begin

         // Lee un Nodo o Registro
         RootNode := XML.DocumentElement.ChildNodes[i];

         // Genera el archivo txt en base a cada Nodo Hijo o Campo del registro xml
         Buffer := EmptyStr;

         for j:= 0 to RootNode.ChildNodes.Count - 1 do
            Buffer := Buffer + RootNode.ChildNodes.Nodes[j].Text + ',';

         Buffer := Copy(Buffer,1,Length(Buffer)-1);

         Writeln(F,Buffer);

      end;

      XML.Active := False;

   finally

      XML := nil;
      CloseFile(F);

   end;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Crea un archivo XML con registros de diferente cantidad de campos, Muestra el mismo en un TListBox y Genera un archivo TXT en base al XML, como se puede ver en la siguiente imagen:



Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 25-04-2015 a las 06:44:21.
Responder Con Cita