Saltar al contenido

Integración de XML y CSV en Java: 2 Ejercicios Prácticos


Introducción:
En este post encontrarás dos ejercicios breves que demuestran cómo combinar datos provenientes de archivos XML y CSV en Java. En el primer ejercicio, fusionamos información de un XML (con países y capitales) y un CSV (con poblaciones) para generar un nuevo XML. En el segundo, convertimos un XML integrado a CSV. ¡Manos a la obra!


Ejercicio 1: Fusiona XML y CSV para generar un nuevo XML

Objetivo:
Combinar datos de dos fuentes:

  • Un archivo XML (countries.xml) con la siguiente estructura: <countries> <country name="España"> <capital>Madrid</capital> </country> <country name="Francia"> <capital>París</capital> </country> </countries>
  • Un archivo CSV (populations.csv) con datos de población: nombre,habitantes España,47420000 Francia,67750000

El objetivo es generar un XML que incluya para cada país el nombre, la capital y la población, por ejemplo:

<geografia>
    <pais nombre="España" capital="Madrid" habitantes="47420000"/>
    <pais nombre="Francia" capital="París" habitantes="67750000"/>
</geografia>

Código del Ejercicio 1:

package EjerciciosIntegracion;

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import java.io.*;
import java.util.*;

public class IntegracionXMLCSV {
    public static void main(String[] args) {
        // 1. Cargar datos del XML con países y capitales
        Countries countries = null;
        try {
            JAXBContext context = JAXBContext.newInstance(Countries.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            countries = (Countries) unmarshaller.unmarshal(new File("countries.xml"));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        
        // 2. Cargar datos del CSV con poblaciones
        Map<String, String> populationMap = new HashMap<>();
        try (BufferedReader br = new BufferedReader(new FileReader("populations.csv"))) {
            String line;
            boolean header = true;
            while ((line = br.readLine()) != null) {
                if(header) { header = false; continue; }
                String[] parts = line.split(",");
                if (parts.length >= 2) {
                    populationMap.put(parts[0].trim(), parts[1].trim());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 3. Combinar los datos para crear la lista de países finales
        List<Pais> paisesList = new ArrayList<>();
        for (CountryXML cx : countries.getCountries()) {
            Pais pais = new Pais();
            pais.setNombre(cx.getName());
            pais.setCapital(cx.getCapital());
            String pop = populationMap.get(cx.getName());
            pais.setHabitantes(pop != null ? pop : "N/A");
            paisesList.add(pais);
        }
        
        // 4. Generar el XML integrado usando JAXB
        Geography geo = new Geography();
        geo.setPaises(paisesList);
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Geography.class);
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(geo, new File("geografia_integrada.xml"));
            System.out.println("XML generado: geografia_integrada.xml");
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

@XmlRootElement(name = "countries")
@XmlAccessorType(XmlAccessType.FIELD)
class Countries {
    @XmlElement(name = "country")
    private List<CountryXML> countries;
    public List<CountryXML> getCountries() { return countries; }
    public void setCountries(List<CountryXML> countries) { this.countries = countries; }
}

@XmlAccessorType(XmlAccessType.FIELD)
class CountryXML {
    @XmlAttribute(name = "name")
    private String name;
    @XmlElement(name = "capital")
    private String capital;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getCapital() { return capital; }
    public void setCapital(String capital) { this.capital = capital; }
}

@XmlRootElement(name = "geografia")
@XmlAccessorType(XmlAccessType.FIELD)
class Geography {
    @XmlElement(name = "pais")
    private List<Pais> paises;
    public List<Pais> getPaises() { return paises; }
    public void setPaises(List<Pais> paises) { this.paises = paises; }
}

@XmlAccessorType(XmlAccessType.FIELD)
class Pais {
    @XmlAttribute(name = "nombre")
    private String nombre;
    @XmlAttribute(name = "capital")
    private String capital;
    @XmlAttribute(name = "habitantes")
    private String habitantes;
    public String getNombre() { return nombre; }
    public void setNombre(String nombre) { this.nombre = nombre; }
    public String getCapital() { return capital; }
    public void setCapital(String capital) { this.capital = capital; }
    public String getHabitantes() { return habitantes; }
    public void setHabitantes(String habitantes) { this.habitantes = habitantes; }
}

Explicación:

  • Lectura del XML: Se utiliza JAXB para deserializar el archivo countries.xml en objetos Java.
  • Lectura del CSV: Con BufferedReader se procesa el archivo populations.csv y se guarda la población en un mapa (clave: nombre del país).
  • Fusión de datos: Se recorre la lista de países obtenida del XML, se asigna la población correspondiente y se crea una lista final de objetos Pais.
  • Generación del XML final: Se utiliza JAXB para serializar el objeto Geography a geografia_integrada.xml.

Ejercicio 2: Convertir un XML Integrado a CSV

Objetivo:
Convertir el XML generado en el Ejercicio 1 (geografia_integrada.xml) a un archivo CSV. La salida tendrá la siguiente estructura:

nombre,capital,habitantes
España,Madrid,47420000
Francia,París,67750000

Código del Ejercicio 2:

package EjerciciosIntegracion;

import javax.xml.bind.*;
import java.io.*;

public class XML_to_CSV {
    public static void main(String[] args) {
        try {
            // 1. Cargar el XML integrado usando JAXB
            JAXBContext context = JAXBContext.newInstance(Geography.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Geography geo = (Geography) unmarshaller.unmarshal(new File("geografia_integrada.xml"));
            
            // 2. Escribir el CSV
            try (PrintWriter pw = new PrintWriter(new File("geografia.csv"))) {
                pw.println("nombre,capital,habitantes");
                for (Pais pais : geo.getPaises()) {
                    pw.println(pais.getNombre() + "," + pais.getCapital() + "," + pais.getHabitantes());
                }
            }
            System.out.println("CSV generado: geografia.csv");
        } catch (JAXBException | IOException e) {
            e.printStackTrace();
        }
    }
}

Nota: Las clases Geography y Pais se reutilizan del Ejercicio 1.

Explicación:

  • Se carga el XML integrado mediante JAXB.
  • Se recorre la lista de países y se escribe cada uno en un archivo CSV, separando los campos con comas.

Conclusión:
Estos dos ejercicios cortos demuestran cómo trabajar con XML y CSV en Java. El primero muestra la integración de datos de dos fuentes distintas para generar un XML consolidado, mientras que el segundo convierte dicho XML a un formato CSV. Son ejemplos prácticos ideales para ampliar tus conocimientos sobre el manejo de distintos formatos de datos en tus proyectos.

Etiquetas:

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.

error: Content is protected !!

Descubre más desde Tomás González: Formador y Desarrollador Web

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad