Delphi y XML (y 3)

Para terminar con XML vamos a ver como nos podemos pasear por los nodos del documento.

Para este ejemplo vamos  usar un ejemplo un poco más extenso que los usados anteriormente:

<libros>
  <libro tipo="novela">
    <nombre>La casa verde</nombre>
    <autor>Mario Vargas Llosa</autor>
  </libro>
  <libro tipo="novela">
    <nombre>Un mundo para Julius</nombre>
    <autor>Alfredo Bryce Echenique</autor>
  </libro>
</libros>
</pre>

A continuación vamos a listar todos los elementos <libro> hijos del elemento <libros> y mostraremos el nombre y el autor de cada uno.

<pre>procedure TForm1.Button2Click(Sender: TObject);
var
  ANode: IXMLNode;
  I: integer;
  CadenaLibro,
  CadenaSalida: string;
begin
  for I := 0 to XMLDocument1.DocumentElement.ChildNodes.Count - 1 do begin
    ANode := XMLDocument1.DocumentElement.ChildNodes[I];
    if ANode.NodeType = ntElement then begin
      CadenaLibro := ANode.ChildNodes['nombre'].Text + ' - ' + ANode.ChildNodes['autor'].Text;
      CadenaSalida := CadenaSalida + CadenaLibro + #13#10;
    end;
  end;
  ShowMessage(CadenaSalida);
end;

Algunas observaciones:

  • Si inspeccionamos el valor de XMLDocument1.DocumentElement.ChildNodes.Count nos devuelve el valor de 7, a pesar de solo haber agregado 2 nodos!! Si vamos al detalle descubriremos que lo 5 nodos extras tienen la propiedad NodeType igual a ntText y los 2 que nos interesan son de tipo ntElement. ¿Por qué se agregaron esos nodos de texto (en blanco por cierto)?. Es por que hemos puesto la propiedad Options/doNodeAutoIndent en True. Esto hace que internamente se agregen los saltos de línea y los espacios en blanco de la indentación. Si ponemos este valor a False y volvemos a hacer la prueba veremos que nos devuelve sólo 2 elementos.
  • Notemos que podemos referenciar los nodos hijos en ChildNodes tanto por su índice como por su nombre.
  • Finalmente, aunque creo que ya es obvio a este punto, XML sólo maneja texto y sólo texto, es decir que si queremos guardar el valor 125.56 tendremos que hacerlo como cadena, igualmente al momento de recuperarlo será como cadena y luego habrá que convertirlo al tipo correcto. Esto no quiere decir que no exista forma de guardar data binaria en un documento XML. Para poder hacer esto deberíamos primero codificar esta data binaria en algún formato de sólo texto como por ejemplo Base64 , UUEncode o algún otro.
  • XML sigue las mismas reglas que HTML sobre el uso de caracteres especiales, por lo que no se puede agregar directamente como texto caracteres como < ó >.

Otras funciones que nos permiten recorrer los elementos del documento son PreviousSibling y NextSibling así como ParentNode.

Anuncios