Saltar al contenido

Ejercicio: Analizador SAX de Catálogo de Videojuegos


Contexto

Dispones de un archivo XML grande con el catálogo de videojuegos de una tienda online. Debes implementar un analizador en streaming con SAX que genere estadísticas y exporte un resumen en CSV sin cargar el XML completo en memoria.

Objetivos de aprendizaje

  • Usar SAXParser y un DefaultHandler.
  • Gestionar startElement, characters (fragmentación de texto) y endElement.
  • Leer atributos, namespaces y CDATA como texto.
  • Implementar estado interno y acumuladores de forma eficiente.
  • Endurecer el parser contra XXE con features de seguridad.
  • (Opcional) Validar con XSD.

Datos de entrada

Archivo: catalogo_juegos.xml (ejemplo reducido)

<?xml version="1.0" encoding="UTF-8"?>
<cat:catalogo xmlns:cat="http://ejemplo.com/juegos" xmlns:met="http://ejemplo.com/meta" generado="2025-10-01">
  <cat:juego id="J001" plataforma="PC">
    <cat:titulo><![CDATA[Hollow Knight]]></cat:titulo>
    <cat:genero>Metroidvania</cat:genero>
    <cat:precio moneda="EUR">14.99</cat:precio>
    <met:rating>4.7</met:rating>
    <cat:fecha>2017-02-24</cat:fecha>
    <cat:tags><cat:tag>indie</cat:tag><cat:tag>2D</cat:tag></cat:tags>
  </cat:juego>

  <cat:juego id="J002" plataforma="Switch">
    <cat:titulo>The Legend of Zelda</cat:titulo>
    <cat:genero>Aventura</cat:genero>
    <cat:precio moneda="EUR">59.99</cat:precio>
    <met:rating>4.9</met:rating>
    <cat:fecha>2023-05-12</cat:fecha>
    <cat:tags><cat:tag>exclusivo</cat:tag></cat:tags>
  </cat:juego>

  <cat:juego id="J003" plataforma="PC">
    <cat:titulo>Factorio</cat:titulo>
    <cat:genero>Gestión</cat:genero>
    <cat:precio moneda="USD">35.00</cat:precio>
    <met:rating>4.8</met:rating>
    <cat:fecha>2020-08-14</cat:fecha>
    <cat:tags><cat:tag>automation</cat:tag><cat:tag>mods</cat:tag></cat:tags>
  </cat:juego>
</cat:catalogo>

(Se asumirá un archivo real con miles de <cat:juego>.)

Requisitos funcionales

  1. Entrada por CLI
    El programa se invoca así: java -jar sax-juegos.jar --in catalogo_juegos.xml --out resumen.csv \ --min-rating 4.5 --plataforma PC --genero Metroidvania
    • --in: ruta al XML (obligatorio)
    • --out: ruta al CSV de salida (obligatorio)
    • Filtros opcionales: --min-rating <double>, --plataforma <string>, --genero <string>
    • Si no hay filtros, procesa todo.
  2. Procesamiento en streaming (SAX)
    • Prohibido usar DOM u otras librerías que construyan árbol completo.
    • Gestiona correctamente que characters() puede ser invocado varias veces por el mismo texto.
  3. Extracción de campos por juego
    Para cada <cat:juego> debes extraer:
    • id (atributo)
    • plataforma (atributo)
    • titulo, genero, precio (texto), moneda (atributo de <cat:precio>), rating (<met:rating>), fecha
    • tags (concatenados por ;)
  4. Salida CSV
    Escribe un CSV con cabecera: id;plataforma;titulo;genero;precio;moneda;rating;fecha;tags Solo incluir filas que cumplan los filtros.
  5. Estadísticas en consola (al finalizar)
    • Total de juegos leídos.
    • Total de juegos emitidos tras filtros.
    • Conteo por plataforma (PC, Switch, PlayStation, etc.).
    • Precio medio por género (solo moneda EUR; ignora otras monedas para la media).
    • Top 3 por rating (muestra id, titulo, rating).
  6. Namespaces
    • Activa namespaceAware.
    • Funciona correctamente con prefijos cat: y met: (no asumas qName).
  7. Seguridad
    • Deshabilita DOCTYPE y entidades externas (XXE).
    • No aceptes XInclude.
  8. Gestión de errores
    • Implementa un ErrorHandler que muestre línea/columna.
    • Ignora de forma segura juegos con datos obligatorios faltantes (loggea y continúa).

Requisitos no funcionales

  • Eficiencia: O(1) memoria respecto al tamaño del archivo (solo buffers necesarios).
  • Código limpio: Handler separado de la clase Main.
  • Mensajes de log claros.
  • Tests unitarios para, al menos, la normalización de texto y el parseo de atributos.

Entregables

  • README.md con instrucciones de compilación/ejecución.
  • src/main/java/...
    • Main.java (parsea args y lanza el parser)
    • JuegosHandler.java (extiende DefaultHandler)
    • ModeloJuego.java (POJO simple)
    • AppErrorHandler.java (errores SAX)
    • CsvWriter.java (emisión de filas)
  • data/catalogo_juegos.xml (mínimo 20 juegos de prueba).
  • out/resumen.csv (generado).
  • (Opcional) schema/catalogo_juegos.xsd.

Criterios de evaluación (rúbrica)

  • Correctitud SAX (30
  • Filtros y salida (25
  • Estadísticas (20
  • Seguridad y robustez (15
  • Calidad del código (10

Retos opcionales (+bonus)

  1. Parada temprana: añade --top-n 100 y detén el parseo cuando hayas emitido N juegos que cumplan filtros (lanza y captura una SAXException propia).
  2. Conversión de moneda: añade --eur-only y descarta juegos no EUR; o (más difícil) convierte USD→EUR con una tasa fija --usd-rate 0.92.
  3. Validación XSD: valida el XML contra catalogo_juegos.xsd e informa errores de esquema.
  4. Resumen JSON: además del CSV, crea resumen.json con las estadísticas finales.
  5. Rutas: imprime la ruta XPath-like del elemento cuando falte un campo obligatorio.

¿Quieres que te dé el esqueleto de clases (sin implementar la lógica) o un XML más largo para pruebas?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

¿Atascado con tu proyecto? Presupuesto GRATIS

X
error: Content is protected !!
Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad