FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Error leyendo archivo XML
Buenos días,
me han encargado un pequeño proyecto en el que tengo que descargar un archivo XML de internet (que es, básicamente, la extracción de una base de datos) para extraer una serie de datos (no todos) del mismo y crear un archivo de texto plano con ellos. Estoy trabajando con Lazarus, sobre linux. Como nunca había trabajado con archivos XML he tenido que buscar información por internet. He encontrado un pequeño ejemplo aquí que funciona bien. El problema es que el archivo XML no es consistente en la cantidad de campos que almacena de cada registro. Dicho de otra manera, hay registros que almacenan 32 campos y otros 33, 34, 35... En principio no debería ser ningún problema dado que uso un bucle que recorre todos los nodos hijo: Código:
for j := 0 to (Item[i].ChildNodes.Count - 1) do begin
__________________
"No guardes nunca en la cabeza aquello que te quepa en un bolsillo." Albert Einstein |
#2
|
||||
|
||||
Sería más fácil si pones tu código y, a ser posible, un ficherito de pruebas.
|
#3
|
||||
|
||||
Sobre todo verifica si la variable "i" tiene el valor correcto.
Puede que estés pidiendo la cantidad de nodos del registro anterior, si no has incrementeado todavía esta variable. Como te dice Casimiro: Pon un poco más de código. Sobre todo las partes en donde haces el bucle sobre "i" y dónde la incrementas. |
#4
|
||||
|
||||
Cita:
Este el procedimiento que hace la lectura del archivo. Los datos que se obtienen se pasan a un componente MEMO (recordad que sólo estoy haciendo pruebas) El error salta al llegar a la línea Código:
Memo.Lines.Add(IntToStr(i) + '.' + IntToStr(j) + ' ' + Item[j].NodeName + ' -> ' + Item[j].FirstChild.NodeValue); Como información, si sólo dejo 8 registros en el archivo XML el programa no falla.
Adjunto el fichero que tengo para hacer las pruebas (es una parte del original con solamente 10 registros). Pd. He compilado en 32 y 64 y el resultado es el mismo. Ppd. Las unidades que usa el programa son DOM y XMLRead
__________________
"No guardes nunca en la cabeza aquello que te quepa en un bolsillo." Albert Einstein |
#5
|
||||
|
||||
arturom,
Cita:
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. Última edición por nlsgarcia fecha: 25-04-2015 a las 06:44:21. |
#6
|
||||
|
||||
Cita:
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 |
#7
|
||||
|
||||
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 me da el error SIGSEGV. Intento solucionarlo añadiendo una cláusula if... 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 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 |
#8
|
||||
|
||||
Deberías entonces mirar primero si contiene un valor.
|
#9
|
||||
|
||||
arturom,
Cita:
Revisa este código: 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:
Nelson. Última edición por nlsgarcia fecha: 28-04-2015 a las 13:29:13. |
#10
|
||||
|
||||
Cita:
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 |
#11
|
||||
|
||||
Error leyendo archivo XML (SOLUCIONADO)
Cita:
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 |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|