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 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
public
end;
const
FileNameXML = 'File_FileName.xml';
FileNameTXT = 'File_FileName.txt';
FieldFrom = 1; FieldTo = 5;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Doc : TXMLDocument;
RootNode, ElementNode,ItemNode,TextNode : TDOMNode;
i, j : integer;
begin
try
SetCurrentDir(ExtractFilePath(Application.ExeName));
Doc := TXMLDocument.Create;
RootNode := Doc.CreateElement('File');
Doc.Appendchild(RootNode);
RootNode := Doc.DocumentElement;
for i := 1 to 3 do
begin
ElementNode := Doc.CreateElement('Record-' + IntToStr(i));
for j := 1 to RandomRange(FieldFrom,FieldTo+1) do begin
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;
WriteXMLFile(Doc,FileNameXML);
finally
Doc.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Doc : TXMLDocument;
RootNode, ElementNode,ItemNode : TDOMNode;
i, j, k : integer;
begin
try
ListBox1.Clear;
SetCurrentDir(ExtractFilePath(Application.ExeName));
Doc := TXMLDocument.Create;
ReadXMLFile(Doc, FileNameXML);
RootNode := Doc.DocumentElement;
ListBox1.Items.Add(StringOfChar('-',10));
for i := 0 to RootNode.ChildNodes.Count - 1 do
begin
ElementNode := RootNode.ChildNodes[i];
ItemNode := ElementNode;
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;
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));
FileMode := fmOpenWrite;
AssignFile(F, FileNameTXT);
Rewrite(F);
Doc := TXMLDocument.Create;
ReadXMLFile(Doc, FileNameXML);
RootNode := Doc.DocumentElement;
for i := 0 to RootNode.ChildNodes.Count - 1 do
begin
ElementNode := RootNode.ChildNodes[i];
ItemNode := ElementNode;
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:
Espero sea útil
Nelson.