Indice


Volver al Indice Autores


Esta práctica ha sido realizada por el grupo 4 de prácticas.
Tanto la programación como la documentación de la práctica han sido realizadas por Guillem Rull Fort y Jose María Rodríguez Valls.

Volver al Indice Introducción


En esta práctica aplicaremos nuestros conocimientos sobre aplicaciones con parses XML. Los parses más utilizados son tipo SAX y DOM aunque en esta sesión utilizaremos únicamente DOM.

La práctica está íntegramente realizada en Java por lo que será necesario entender el funcionamiento con los ejemplos y documentación facilitados.

Volver al Indice Entorno


Dispondremos de un compilador JDK con los paquetes Xerces y JDOM.

Será necesario crear el DTD asociado al XML que nos facilitan para realizar la práctica.

El Objetivo de la práctica es visualizar los pedidos contenidos en el documento XML.

Volver al Indice Implementación


Shop.xml


Este archivo es el que tiene todo el contenido XML que posteriormente utilizaremos para visualizar los pedidos.
El documento tiene asociado un DTD denominado shop.dtd

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE shop SYSTEM "shop.dtd">
<list>
<op name="Supply">
<item precio="123456" unidades="60">mesa hola comedor haya</item>
<item precio="13456" unidades="100">mesa cocina nogal</item>
<item precio="13457" unidades="200">silla cocina nogal</item>
</op>

<res name="Supply"/>

<op name="Order" u="juan" pass="nauj">
<item unidades="1">mesa comedor haya</item>
<item unidades="4">silla cocina nogal</item>
</op>

<res name="Order">
<order>
<id>345</id>
<item unidades="1" precio="123456">mesa comedor haya</item>
<item unidades="4" precio="13457">silla cocina nogal</item>
<total>177284</total>
</order>
</res>

<op name="List" u="juan" pass="nauj" />

<res>
<order>
<id>345</id>
<item unidades="1" precio="123456">mesa comedor haya</item>
<item unidades="4" precio="13457">silla cocina nogal</item>
<total>177284</total>
</order>
<order>
<item unidades="0" precio="123456">mesa comedor haya</item>
</order>
<total>1234567</total>
</res>

</list>


Shop.dtd


Este será el archivo encargado de validar el documento XML.

<!ELEMENT list (op, res)*>
<!ELEMENT op (item*)>
<!ATTLIST op
  name CDATA #REQUIRED
  u CDATA #IMPLIED
  pass CDATA #IMPLIED>
<!ELEMENT item (#PCDATA)>
<!ATTLIST item
  precio CDATA #IMPLIED
  unidades CDATA #REQUIRED>
<!ELEMENT res (order*, total?)>
<!ATTLIST res
  name CDATA #IMPLIED>
<!ELEMENT order (id?, item+, total?)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT total (#PCDATA)>



Sessio6.java


A continuación implementamos la clase encargada de realizar el parse del documento pasado como parámetro.

import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.input.DOMBuilder;
import org.jdom.output.*;
import java.util.*;

public class sessio6 {

  public static void main(String[] args) {
    if (args.length == 0) {
      System.out.println("Usage: java Count URL");
    }

    SAXBuilder saxBuilder = new SAXBuilder();
    DOMBuilder domBuilder = new DOMBuilder();

    try {
      Document jdomDocument = saxBuilder.build(args[0]);
      DOMOutputter domOutputter = new DOMOutputter();

      org.w3c.dom.Element domElement = domOutputter.output(jdomDocument.getRootElement());

      org.jdom.Element jdomElement = domBuilder.build(domElement);

      System.out.println("Listado de pedidos:\n");
      imprimirPedidos(jdomElement);
    } catch (JDOMException e) { // indica doc mal formado u otro error
      System.out.println("Documento XML mal formado o incorrecto.");
      System.out.println(e.getMessage());
    }
  }

  //Retorna true si existe un atributo con el nombre y valor pasados
  //por parámetro...
  private static boolean contiene(List attributes,String name,String value) {
    Iterator iter = attributes.iterator();
    while (iter.hasNext()) {
      Attribute a = (Attribute)iter.next();
      if (a.getName().equals(name) && a.getValue().equals(value)) {
         return true;
      }
    }
    return false;
  }


  //Busca entre todos los Tag el que contiene los pedidos...
  //En concreto <res name="Order">
  private static void imprimirPedidos(Element element) {
    List children = element.getMixedContent();
    Iterator iterator = children.iterator();
    while (iterator.hasNext()) {
      Object o = iterator.next();
      if (o instanceof Element) {

        //Obtiene los atributos del Tag actual...
        List attributes = ((Element)o).getAttributes();

        //Comprueba si el Tag que contiene los pedidos...
        if (((Element)o).getName().equals("res") && contiene(attributes, "name", "Order")) {
          imprimirResOrders((Element)o); //Imprime los pedidos...
        }
        else imprimirPedidos((Element)o);
      }
    }
  }

  //Busca las ordenes de pedido para imprimirlas...
  //En concreto los tag <order>
  private static void imprimirResOrders(Element element) {
    List children = element.getMixedContent();
    Iterator iterator = children.iterator();
    while (iterator.hasNext()) {
      Object o = iterator.next();
      //Busca el Tag order...
      if (o instanceof Element && ((Element)o).getName().equals("order")) {
        imprimirResOrder((Element)o); //Imprime el order del pedido...
      }
    }
  }

  //Visualiza los datos del order actual...
  private static void imprimirResOrder(Element element) {
    List children = element.getMixedContent();
    Iterator iterator = children.iterator();
    while (iterator.hasNext()) {
      Object obj = iterator.next();
      if (obj instanceof Element) {
         Element o = (Element)obj;
         //Visualizar el id del pedido...
         if (o.getName().equals("id")) {
           System.out.println("Pedido " + o.getText());
         }
         else if (o.getName().equals("item")) {
           imprimirResOrderItem(o); //Imprimir producto...
         }
         else if (o.getName().equals("total")) {
           //Visualiza el total...
           System.out.println("Total: " + o.getText());
         }
      }
    }
    System.out.println();
  }

  //Visualiza los atributos de un item (Unidades y Cantidad)...
  private static void imprimirResOrderItem(Element element) {
    String unidades = "", precio = "";
    //Obtener atributos...
    List attributes = element.getAttributes();

    Iterator iter = attributes.iterator();
    while (iter.hasNext()) {
      Attribute a = (Attribute)iter.next();

      //Visualizar las unidades y precio...
      if (a.getName().equals("unidades")) {
        unidades = a.getValue();
      }
      else if (a.getName().equals("precio")) {
        precio = a.getValue();
      }
    }

    System.out.println("- " + unidades + " \"" + element.getText() + "\" con precio " + precio);
  }
}


Volver al Indice Resultados


Hemos conseguido que toda la práctica funcione con completa normalidad.

Para su correcto funcionamiento será necesario indicar los parámetros de forma correcta. Siendo:

java sessio6 shop.xml

Donde shop.xml será el documento XML a procesar.

XML


Los documentos XML están basados en una serie de marcas con estrictas condiciones que facilitan el intercambio de información de una manera clara y ordenada.

Ventajas de usar XML

- Permiten almacenar los datos basándose en estructuras.
- Son datos plenamente personalizados según las necesidades puntuales.
- Son fáciles de automatizar y gestionar.

Inconvenientes de usar XML

- Son documentos de tipo texto en formato plano. Ocupan más que otras estructuras.


Volver al Indice Conclusiones


En esta sesión nos ha hecho falta documentarnos sobre los métodos y funciones básicos para realizar un recorrido DOM.

Observando el funcionamiento de los ejemplos proporcionados hemos aprendido a realizar el parseado.

Primero hemos instalado los paquetes Xerces y JDom, posteriormente hemos preparado el DTD para validar el documento XML.

Después hemos pasado a la implementación de la práctica basándonos en la documentación y ejemplos anteriores.

Por último se han realizado algunas pruebas y la documentación de la práctica.