5 Generar HTML

Una aplicación interesante usando XML es generar documentos en formato HTML a partir de los datos de nuestras aplicaciones.

Un documento HTML no se diferencia demasiado de un documento XML, de hecho, los documentos XHTML se pueden mostrar perfectamente en un navegador web, y es relativamente sencillo generarlos usando libXML2.

Para empezar, un documento XHTML es un documento XML, por lo que la primera línea debe ser una cabecera con el formato:

<?xml version="1.0" encoding="UTF-8"?>

Indicando la codificación de caracteres que se usará en el documento. En este caso UTF-8.

También debe aparecer una declaración DOCTYPE que debe hacer referencia a uno de los tres DTDs existentes, estricto, transicional o frameset:

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

Crear un documento

Para crear un documento HTML usaremos la función htmlNewDoc o, si se quiere omitir el DTD htmlNewDocNoDtD. Esta función nos devuelve un htmlDocPtr, que usaremos para manipular el documento, añadir nodos y guardarlo.

    xmlChar DtdID[] = "-//W3C//DTD XHTML 1.0 Strict//EN\";
    xmlChar DtdURI[] = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\";
...
    // Crear el documento con DTD:
    doc = htmlNewDoc(DtdURI, DtdId);

Insertar el nodo raíz

El nodo raíz de un documento XHTML es HTML, a la que se suelen añadir algunos atributos, como un espacio con nombre y el lenguaje usado en los datos. Por ejemplo:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">

Para insertar el nodo raíz usaremos la función

    xmlChar tagHtml[] = "html";
...
    // Nodo raíz:
    nodo_raiz = xmlNewDocNode(doc, NULL, tagHtml, NULL);
    xmlDocSetRootElement(doc, nodo_raiz);

    // Añadir atributos:
    xmlNewProp(nodo_raiz, BAD_CAST "lang", BAD_CAST "es");

Los atributos xmlns y xml:lang se insertan automáticamente.

Nodos head y body

Dentro del nodo raíz se añaden otros nodos, como head y body. Si conoces algo de HTML, el resto de la estructura te será familiar.

En el nodo head insertaremos otros nodos, como enlaces a hojas de estilo, definiciones de estilo, título, nodos meta, scripts, etc.

Por ejemplo, para añadir un nodo title al nodo head:

    xmlNodePtr head = xmlNewChild(nodo_raiz, NULL, BAD_CAST "head", NULL);
    xmlNewChild(head, NULL, BAD_CAST "title", BAD_CAST "Informe");

En el nodo body insertaremos el texto del documento, formateado usando las etiquetas HTML, como p, pre, table, etc.

Por ejemplo:

    xmlNodePtr  body = xmlNewChild(nodo_raiz, NULL, BAD_CAST "body", NULL);
    xmlNewChild(body, NULL, BAD_CAST  "h1", BAD_CAST "INFORME HTML");
    xmlNewChild(body, NULL, BAD_CAST  "p", BAD_CAST "Informe de ventas 2024");

Podemos enviar el documento generado directamente a nuestro navegador usando la función ShellExecute:

    xmlSaveFileEnc("salida.html", doc, "UTF8");
    ShellExecute(NULL, "open", "salida.html", NULL, NULL, SW_SHOWDEFAULT);

Ejemplo 8

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 8 xml005.zip 2024-02-14 1882 bytes 66