Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-04-2015
Avatar de arturom
arturom arturom is offline
Miembro
 
Registrado: dic 2003
Ubicación: Alicante
Posts: 91
Poder: 21
arturom Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
arturom,




Revisa este código:

...

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.
Gracias Nelson,
voy a revisarlo, aunque ya comenté que trabajo en Lazarus sobre linux.
Voy a intentar adaptarlo y hacer pruebas con el.

Saludos
__________________
"No guardes nunca en la cabeza aquello que te quepa en un bolsillo."

Albert Einstein
Responder Con Cita
  #2  
Antiguo 27-04-2015
Avatar de arturom
arturom arturom is offline
Miembro
 
Registrado: dic 2003
Ubicación: Alicante
Posts: 91
Poder: 21
arturom Va por buen camino
Hola de nuevo,
poco a poco voy avanzando en el problema.

Aunque agradezco a Nelson su interés y dedicación, el programa que estoy haciendo realmente funciona bien.
Después de hacer varias comprobaciones, he detectado que el bucle funciona como debería.

El problema surge porque uno de los registros del archivo viene con un campo que no contiene ningún valor, así, al llegar a esta línea
Código Delphi [-]
if Item[j].NodeName = 'ean' then
  t_EAN:=Item[j].FirstChild.NodeValue;
me da el error SIGSEGV.

Intento solucionarlo añadiendo una cláusula if...
Código Delphi [-]
if Item[j].NodeName = 'ean' then
  if Item[j].FirstChild.NodeValue = '' then
    t_EAN := 'XXXXXXXXXXXXX';
pero sigue saltando el error SIGSEGV al comparar NodeValue con una cadena vacía.

No lo entiendo, se supone que el valor de NodeValue es un DOMString->XMLString->WideString con lo que no debería saltar el error...

PD. He detectado que en realidad, el error salta en la línea
Código Delphi [-]
if Item[j].NodeName = 'ean' then
sin ni siquiera entrar al segundo if...
__________________
"No guardes nunca en la cabeza aquello que te quepa en un bolsillo."

Albert Einstein

Última edición por arturom fecha: 27-04-2015 a las 13:56:37. Razón: Ampliar información
Responder Con Cita
  #3  
Antiguo 27-04-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Deberías entonces mirar primero si contiene un valor.

Código Delphi [-]
if Item[j].NodeName = 'ean' then
begin
  // Primero verifico si hay datos
  if (Item[j].FirstChild.HasChildNode) then
    t_EAN := Item[j].FirstChild.NodeValue
  else
    t_EAN := 'XXXXXXXXXXXXX';
end;
Responder Con Cita
  #4  
Antiguo 28-04-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 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
  #5  
Antiguo 28-04-2015
Avatar de arturom
arturom arturom is offline
Miembro
 
Registrado: dic 2003
Ubicación: Alicante
Posts: 91
Poder: 21
arturom Va por buen camino
Error leyendo archivo XML (SOLUCIONADO)

Cita:
Empezado por nlsgarcia Ver Mensaje
arturom,




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

{$mode objfpc}{$H+}

interface

...

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:

...

Espero sea útil

Nelson.
Vaya Nelson, es ¡¡ FANTÁSTICO !!

No se me ocurre ninguna manera de agradecértelo lo suficiente, ya estaba empezando a pensar que no había forma de controlarlo.

Funciona perfecto, el primer procedimiento no lo necesito, ya que obtengo el archivo XML directamente de internet, pero aún así, de verdad, muchas gracias por tu interés y esfuerzo.

Apúntate que te debo unas cuantas
__________________
"No guardes nunca en la cabeza aquello que te quepa en un bolsillo."

Albert Einstein

Última edición por arturom fecha: 28-04-2015 a las 08:42:09. Razón: Corregir ortografía
Responder Con Cita
  #6  
Antiguo 28-04-2015
Avatar de arturom
arturom arturom is offline
Miembro
 
Registrado: dic 2003
Ubicación: Alicante
Posts: 91
Poder: 21
arturom Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Deberías entonces mirar primero si contiene un valor.

Código Delphi [-]
if Item[j].NodeName = 'ean' then
begin
  // Primero verifico si hay datos
  if (Item[j].FirstChild.HasChildNode) then
    t_EAN := Item[j].FirstChild.NodeValue
  else
    t_EAN := 'XXXXXXXXXXXXX';
end;
Gracias por tu interés duilioisola, pero sigue fallando.

Tal y como comentaba en mi último mensaje, se detiene con un error SIGSEGV en la línea if (Item[j].FirstChild.HasChildNode) then por lo que no hace asignaciones.
__________________
"No guardes nunca en la cabeza aquello que te quepa en un bolsillo."

Albert Einstein
Responder Con Cita
Respuesta



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
Fin de archivo leyendo archivos de texto lbidi Varios 3 28-03-2014 20:16:45
Qué libro estoy leyendo? marcoszorrilla La Taberna 27 19-07-2011 00:39:14
Problema con ADO leyendo excel RICTAPIA5 Conexión con bases de datos 2 26-01-2011 18:09:04
leyendo tabla en excel solarin Conexión con bases de datos 3 25-01-2011 23:41:05
Error de logon 1326 leyendo carpeta con Windows 2003 Server JuanErasmo C++ Builder 0 16-09-2008 16:29:54


La franja horaria es GMT +2. Ahora son las 11:49:01.


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