MODULO 3: Programación XML
Para
realizar esta parte de la práctica es necesario disponer de una
herramienta de desarrollo XML. Para esta práctica se ha optado
por una copia de libre distribución de XML4J.
Para conocer las clases Java y sus métodos consulte la API de
XML4J que hay en la copia local de su equipo (suponiendo que ya tiene
instalada la herramienta). La API se instala dentro de un directorio /doc/Javadoc/api. Tambien puede
consultar una API en
linea.
Para
hacer uso de la librería XML es necesario indicar donde se
encuentra
las clases o el paquete JAR, que contiene dichas clases. Para esto es
necesario
usar el comando CLASSPATH.
-
CLASSPATH=/rutaXML/xml4j_1_1_9.jar:$CLASSPATH
export
CLASSPATH
-
-
Programación
XML con Java
-
NOTA 1
Esta
página web no pretende enseñar a programar XML en Java,
sino
que sirve de apoyo a las clases de laboratorio. En las clases de
teoría
se imparten nociones relacionadas con la programación XML + Java.
|
NOTA
2
Para
estas practicas finalmente se ha optado por la versión XML4J de
IBM para trabajar con XML en Java. Las funciones de XML usadas
normalmente
pertenecen al estilo DOM del W3C, y vienen en cualquier paquete XML
(como
XML4J). Sin embargo, en cada paquete los fabricantes incluyen algunas
utilidades
propias, como extensiones del DOM de W3C. Por ejemplo, el paquete XML4J
incluye la programación DOM en la ruta “org.w3c.dom”
(indistintamente
del paquete que se use) y tambien incluye la ruta “com.ibm.com” para
utilidades.
|
-
NOTA
3
Recuerde
que en Java el nombre de una clase debe coincidir con el nombre del
archivo
que la contiene.
|
-
Ejemplo
XML 1
-
Vamos
a desarrollar un primer ejemplo en Java que lo único que realiza
es una compilación de un documento supuestamente en XML. Esto se
realiza con el siguiente código:
1
import org.w3c.dom.Document;
2
import com.ibm.xml.parser.Parser;
3
import java.io.FileInputStream;
4
public class SimpleParse {
5
public static void main(String[] argv) {
6
if (argv.length != 1) {
7
System.err.println("Es necesario un nombre de archivo.");
8
System.exit(1);
9
}
10
try {
11
FileInputStream is = new FileInputStream(argv[0]);
12
Parser parser = new Parser(argv[0]);
13
Document doc = parser.readStream(is);
14
if (parser.getNumberOfErrors() > 0) {
15
System.exit(1);
16
}
17
} catch (Exception e) {
18
e.printStackTrace();
19
}
20
}
21
} |
Figura
1. Un programa java que compila un documento XML.
-
Para
este programa: -
En
la línea 1 se hace uso de la clase Document, extraida de
org.w3c.dom
del paquete que se está utilizando para trabajar con XML.
-
En
la linea 2 se hace uso de la clase Parser, extraida de
com.ibm.xml.parser
del paquete que se está utilizando para trabajar con XML.
-
Lo
normal es que para otros programas java algo mas complejos que el
mostrado
en la figura anterior, se utilice todas las clases incluidas para el
Parser,
esto es, hay que incluir al inicio de los programas lo siguiente:
-
import
com.ibm.xml.parser.* ;
-
Veamos
el comportamiento para el resto de las lineas.
-
11
FileInputStream is = new FileInputStream(argv[0]);
-
Esta
línea crea una secuencia de entrada (“input stream”, is) para
leer
un archivo.
-
12
Parser parser = new Parser(argv[0]);
-
Esta
línea crea una instancia de un objeto Parser.
-
13
Document doc = parser.readStream(is);
-
Esta
línea pasa la secuencia al analizador sintáctico de XML.
-
Ejercicio
Genere
un
documento XML simple
y compruebe el funcionamiento del programa.
Incluya
algún tipo de
error en el documento XML anterior para errores.
-
Ejemplo
XML 2
-
Ahora
vamos a ver un ejemplo que crea un registro XML de la siguiente forma:
<persona>
<nombre>Luis Iribarne</persona>
<edad>35</edad>
<url href="http://www.ual.es/~liribarn"/>
</persona>
-
El
programa para hacer esto es el siguiente:
import
com.ibm.xml.parser.TXDocument;
import
org.w3c.dom.Document;
import
org.w3c.dom.Element;
import
org.w3c.dom.Text;
import
org.w3c.dom.ProcessingInstruction;
import
java.io.PrintWriter;
public
class MakeDocumentWithFactory {
public static void main(String[] argv) {
try {
// Crea un objeto de tipo Document
Document doc =
(Document)Class.forName("com.ibm.xml.parser.TXDocument").newInstance();
// Crea el elemento <persona> como raiz
Element root = doc.createElement("persona");
// Crea el elemento <nombre> y lo añade
Element item = doc.createElement("nombre");
item.appendChild(doc.createTextNode("Luis Iribarne"));
root.appendChild(item);
// Crea un elemento <edad> y lo añade
item = doc.createElement("edad");
item.appendChild(doc.createTextNode("35"));
root.appendChild(item);
// Crea el elemento <email> y lo añade
item = doc.createElement("email");
item.appendChild(doc.createTextNode("liribarne@ual.es"));
// Crea un elemento <url> con un atributo y lo añade
item = doc.createElement("url");
item.setAttribute("href", "http://www.ual.es/~liribarn");
root.appendChild(item);
// Ahora añade el raiz al documento,
doc.appendChild(root);
// y muestra el documento
((TXDocument)doc).setVersion("1.0");// @XML4J
((TXDocument)doc).printWithFormat(new PrintWriter(System.out));
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
Figura
2. Este código crea un registro
Ejercicio
Modifique
la Servlet del productor/consumidor para crear el registro XML que
acepte
los dos datos de entrada del productor. No
intente devolver
directamente el documento DOM desde la Servlet hacia el Cliente ya que
esta operación no se puede realizar directamente. Para comprobar si se ha creado
correctamente el documento XML, almacénelo en un archivo. Devuelva al cliente un mensaje
que advierta del resultado de la operacion; por ejemplo, "No se ha
podido crear el documento XML", "No se ha podido almacenar el documento
XML", "El documento XML se ha creado correctamente", etc.
LSID,
Laboratorio
de Sistemas de Informática
Departamento
de Lenguajes y Computación
Universidad
de Almeria, España
Luis.Iribarne@ual.es