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.

Deja un comentario

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