02
Jul
07

Leer Archivos XML con Lazarus I

XML es un formato de archivo bastante entendible para guardar documentos estructurados o pasar información de programa a programa, por lo que se hace necesario conocerlo, Free Pascal tiene librerías necesarias para poder leer y escribir en este formato, fáciles de aprender e igualmente de aplicar, en este primer post solo veremos como acceder y leer los archivos XML obteniendo los datos fácilmente.

Abrimos Lazarus y creamos un nuevo proyecto. Luego en el formulario colocamos estos componentes y les colocamos las propiedades siguientes:

Componente Nombre(Name) Caption
TForm FLMXL Lector XML
TButton BtnLeer &Leer XML
TButton BtnCerrar &Cerrar
TMemo Memo

Colocando los componetes tomando como ejemplo la siguiente imágen:

FormularioXML

Y guardamos el proyecto.

Para acceder a las funciones de manejo de XML en Lazarus o Free Pascal solamente debemos llamar a las librerías DOM y XMLRead, añadiéndolas a la lista de librerías en la clausula uses.

Ahora necesitamos un archivo XML para las pruebas, dentro del cual escribiremos lo siguiente:

<?xml version="1.0"?>
<ejemplo>
  <ejemploinfo>
    <autor>develazarus</autor>
    <fecha>1 de Julio de 2007</fecha>
    <dato>primer dato</dato>
    <dato>Segundo dato</dato>
    <dato>Tercer dato</dato>
    <dato>Cuarto dato</dato>
    <val tipo="dato cadena">inspeccionando</val>
  </ejemploinfo>
  <texto>
    <cabecera>Esto es la cabecera</cabecera>
    <linea>Esto es una linea de texto.</linea>
  </texto>
</ejemplo>

lo guardamos con el nombre “ejemplo.xml” dentro de la carpeta donde guardamos el proyecto, para que sea fácilmente accesible desde el código.

El código XML es tratado por las librerías como un conjunto de nodos, por lo que podríamos ejemplificar el archivo anterior de la siguiente manera:

Nodos XML

En XML todo empieza con el nodo raiz, que en el caso de nuestro archivo es “ejemplo”, luego estan los nodos hijos de la raiz, que son ejemploinfo y texto, y estos a su vez son nodos padre de cada uno de los nodos que están abajo.

Cada nodo puede tener datos o atributos, los datos o valores de los nodos que vemos en el archivo ejemplo.xml, como por ejemplo el de autor (develazarus), es otro nodo, un nodo hijo del nodo autor, si obtuviésemos el valor del nodo autor no nos devolvería nada. Los datos y atributos de cada nodo son tratados como nodos hijos, esto es algo que hay que tener en cuenta.

Pero empecemos para ver como funciona ya en Lazarus:

En el evento onClick de BtnLeer colocamos:

procedure TFLXML.BtnLeerClick(Sender: TObject);
var
  //variable de tipo TXMLDocument para cargar documentos XML
  Doc :  TXMLDocument;
  i, j : integer;
begin
  Doc := TXMLDocument.Create;
  //cargando el archivo XML
  ReadXMLFile(Doc, 'ejemplo.xml');
  Memo.Lines.Clear;
  //obteniendo el nombre del nodo raiz
  Memo.Lines.Add('Archvo tipo : '+Doc.DocumentElement.NodeName);
  //trabajando con los nodos inferiores a la raiz
  with Doc.DocumentElement.ChildNodes do
  begin
    {la variable "Count", propiedad de ChildNodes
     contiene el numero total de nodos hijos que existen
     en este caso en el nodo raiz}
    for i := 0 to (Count - 1) do
    begin
      {Item[i] es el nodo al que vamos a acceder y su propiedad
       NodeName nos devuelve el nombre del nodo}
      Memo.Lines.Add(intToStr(i)+'. '+Item[i].NodeName);
      {ahora usamos la propiedad Count pero ahora de los nodos
       con los que estamos trabajando}
      for j := 0 to (Item[i].ChildNodes.Count - 1) do
      begin
        {ahora entraremos a los nodos hijos de los nodos
         anteriores}
        with Item[i].ChildNodes do
        begin
          {Item[j].FirstChild nos devuelve el primer nodo hijo y
           NodeValue es la propiedad que nos devolvera el valor
           o contenido de ese nodo}
          Memo.Lines.Add(IntToStr(i)+'.'+IntToStr(j)+' '
            + Item[j].NodeName + ' -> '
            + Item[j].FirstChild.NodeValue);
          if Item[j].NodeName = 'val' then
            Memo.Lines.Add('  Atrbuto "tipo" del nodo val = '
            + Item[j].Attributes.GetNamedItem('tipo').NodeValue);
              {Para obtener los atributos de un nodo
               utilizamos la propiedad Attributes}
        end;
      end;
    end;
  end;
  Doc.Free;
  //es necesario liberar la memoria que ocupo la variable Doc
end;

y en evento onClick de BtnCerrar colocamos:

procedure TFLXML.BtnCerrarClick(Sender: TObject);
begin
  Close;
end;

Solo nos resta compilar y ejecutar la aplicación, esto lo podemos hacer fácilmente con la tecla F9 😉

Luego de esto ya tendremos nuestra aplicación leyendo los datos del archivo XML.

Lector de XML Funcionando

Basado en iformación de:
Homepage Von Thomas Zastrow -> FPC y XML (inglés)
XML Tutorial -> Tutorial explicativo de XML (inglés)
Document Object Model -> Especificación del modelo DOM (inglés)
Lazarus wiki -> Tutorial de Lazarus con XML (inglés)

Anuncios

8 Responses to “Leer Archivos XML con Lazarus I”


  1. 1 FranM
    julio 5, 2007 en 1:18 am

    Te felicito por este blog. Existe muy poca ayuda en español sobre lazarus.
    Y una pregunta ,con el DOM y XMLRead ( write) solo consigo abrir xml en formato utf-8, sabes si puedo abrir otras codificaciones. Si en tu xml de ejemplo utilizas tildes verás q falla.

    Gracias

  2. julio 5, 2007 en 7:31 pm

    @FranM Gracias por el primer cometario 😀
    Pues en el próximo post hablare del XMLWrite, el formato del xml se puede cambiar, lo he hecho en C y C++, pero no tardaré en encontrarlo en FPC 😀
    Hacerca de las tildes, falla por la codificación con que trabajas, tanto el xml como el archivo fuente.

    Saludos.

  3. 3 joshi
    abril 22, 2009 en 10:13 pm

    oye estas consultas son muy buenas, pero mi duda es, en mi trabajo me pusieron a hacerlo y tambien busqueda de nodos, se puede hacer, en visual basic se ocupa un objeto que se llama algo como nodelist, y se hace la consulta ejm (“\\reg\[@campo =” & valor & “]”) y con eso nos devuelve solo los registros con el valor ke se desea(filtro)eso se puede hacer desde lazarus? o almenos algo parecido?

  4. septiembre 12, 2009 en 7:02 am

    Buen blog, aguante lazarus…

  5. 5 sergio
    octubre 3, 2009 en 3:37 pm

    se agradece esta aportación, solo una sugerencia: es muy incomodo leer una página web con fondo negro sobre todo cuando el texto es negro o azul..

  6. 6 Walter Luis Duverger
    abril 28, 2010 en 6:44 pm

    Esta buenisimo, pero me esta lo voy a probar ojala y me sirva


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


CGSOL 2008

Publicidad CGSOL 2008

A %d blogueros les gusta esto: