Ver Mensaje Individual
  #9  
Antiguo 28-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
...trabajo en Lazarus sobre Linux...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;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, DOM, XMLRead, XMLWrite, Math;

type

  { TForm1 }

  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 *.lfm}

{ TForm1 }

// Crea un archivo XML
procedure TForm1.Button1Click(Sender: TObject);
var
   Doc : TXMLDocument;
   RootNode, ElementNode,ItemNode,TextNode : TDOMNode;
   i, j : integer;

begin

  try

     SetCurrentDir(ExtractFilePath(Application.ExeName));

     // Crea el cuerpo princial del documento XML
     Doc := TXMLDocument.Create;

     // Crea el Nodo Raiz
     RootNode := Doc.CreateElement('File');
     Doc.Appendchild(RootNode);
     RootNode := Doc.DocumentElement;

     // Crea los Nodos de la Raiz
     for i := 1 to 3 do
     begin
        // Crea un Nodo Registro
        ElementNode := Doc.CreateElement('Record-' + IntToStr(i));

        for j := 1 to RandomRange(FieldFrom,FieldTo+1) do  // Genera N Nodos Hijos o Campos del Archivo XML de forma Aleatoria
        begin
           // Crea un Nodo Hijo o Campo del Registro
           ItemNode := Doc.CreateElement('Field-' + IntToStr(j));
           TextNode := Doc.CreateTextNode('Field-' + IntToStr(j) + ' Value-' + IntToStr(Random(100)));
           ItemNode.AppendChild(TextNode);
           ElementNode.AppendChild(ItemNode);
        end;

        RootNode.AppendChild(ElementNode);
    end;

    // Salva el archivo XML
    WriteXMLFile(Doc,FileNameXML);

  finally

    Doc.Free;

  end;

end;

// Lee un archivo XML
procedure TForm1.Button2Click(Sender: TObject);
var
   Doc : TXMLDocument;
   RootNode, ElementNode,ItemNode : TDOMNode;
   i, j, k : integer;

begin

   try

      ListBox1.Clear;

      SetCurrentDir(ExtractFilePath(Application.ExeName));

      // Crea un Documento XML
      Doc := TXMLDocument.Create;

      // Lee el Archivo XML
      ReadXMLFile(Doc, FileNameXML);

      RootNode := Doc.DocumentElement;

      ListBox1.Items.Add(StringOfChar('-',10));

      // Recorre estructura dek archivo XML
      for i := 0 to RootNode.ChildNodes.Count - 1 do
      begin

         ElementNode := RootNode.ChildNodes[i];
         ItemNode := ElementNode;

         // Lee cada Nodo Hijo o Campo del registro
         for j := 0 to ElementNode.ChildNodes.Count - 1 do
            for k := 0 to ItemNode.ChildNodes.Item[j].ChildNodes.Count - 1 do
               ListBox1.Items.Add(ItemNode.ChildNodes.Item[j].ChildNodes.Item[k].NodeValue);

         ListBox1.Items.Add(StringOfChar('-',10));

      end;

   finally

      Doc.Free;

   end;

end;

// Crea un archivo TXT en base a un archivo XML
procedure TForm1.Button3Click(Sender: TObject);
var
   Doc : TXMLDocument;
   RootNode, ElementNode, ItemNode : TDOMNode;
   i, j, k : integer;
   F : TextFile;
   Buffer : String;

begin

   try

      SetCurrentDir(ExtractFilePath(Application.ExeName));

      // Crea archivo TXT
      FileMode := fmOpenWrite;
      AssignFile(F, FileNameTXT);
      Rewrite(F);

      // Crea un Documento XML
      Doc := TXMLDocument.Create;

      // Lee el Archivo XML
      ReadXMLFile(Doc, FileNameXML);

      RootNode := Doc.DocumentElement;

      // Recorre la estructura del archivo XML
      for i := 0 to RootNode.ChildNodes.Count - 1 do
      begin

         ElementNode := RootNode.ChildNodes[i];
         ItemNode := ElementNode;

         // Genera el archivo txt en base a cada Nodo Hijo o Campo del registro xml

         Buffer := EmptyStr;

         for j := 0 to ElementNode.ChildNodes.Count - 1 do
            for k := 0 to ItemNode.ChildNodes.Item[j].ChildNodes.Count - 1 do
               Buffer := Buffer + ItemNode.ChildNodes.Item[j].ChildNodes.Item[k].NodeValue + ',';

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

         Writeln(F,Buffer);

      end;

   finally

      Doc.Free;
      CloseFile(F);

   end;

end;

end.
El código anterior en Lazarus 1.4.0 FPC 2.6.4 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:



Revisa esta información:
Cita:
XML Tutorial
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 28-04-2015 a las 13:29:13.
Responder Con Cita