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 archivopopulations.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
ageografia_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
yPais
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.
