Hola
samirllorente,
Puedes leer tu fichero XML mediante
JAXB, que es el API de Java para manejo de ficheros XML. Lo único que necesitarás es crear clases (entidades) que representen a cada
etiqueta. Un ejemplo aplicado a tu XML:
Ésta clase es el
Root, es decir, la etiqueta que engloba todo (<Gestion></Gestion>):
Managementpackage com.company.model.entities;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author gus
*/
@XmlRootElement(name="Gestion")
@XmlAccessorType(XmlAccessType.FIELD)
public class Management {
@XmlElement(name="Velocidad")
@XmlElement(name="Process")
private List<Process> processes;
public Management() {
}
public Management
(Double velocity, List
<Process
> processes
) { this.velocity = velocity;
this.processes = processes;
}
return velocity;
}
public void setVelocity
(Double velocity
) { this.velocity = velocity;
}
public List<Process> getProcesses() {
return processes;
}
public void setProcesses(List<Process> processes) {
this.processes = processes;
}
}
Como puedes darte cuenta hay un par de anotaciones interesantes:
- @XmlRootElement: Indica que es el elemento padre de una jerarquía.
- @XmlElement: Indica que es un elemento XML (un tag).
- @XmlAccessorType, @XmlAccessType.FIELD: La primera se usa para establecer el tipo de acceso. La segunda indica que se accederá a los valores por propiedades (y no por getters/setters).
El atributo
name de las anotaciones se usa para especificar el valor que deben tener las propiedades (tags) en el XML.
Ahora veamos las entidades
Process y
Activity:
Processpackage com.company.model.entities;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author gus
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlElement(name="Pid")
@XmlElement(name="Name")
@XmlElement(name="Quantum")
private Short quantum
; // ¿quántico? @XmlElement(name="Actividad")
private Activity activity;
}
this.pid = pid;
this.name = name;
this.quantum = quantum;
this.activity = activity;
}
return pid;
}
public void setPid
(Short pid
) { this.pid = pid;
}
return name;
}
public void setName
(String name
) { this.name = name;
}
public Short getQuantum
() { return quantum;
}
public void setQuantum
(Short quantum
) { this.quantum = quantum;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
}
Activitypackage com.company.model.entities;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author gus
*/
@XmlAccessorType(XmlAccessType.FIELD)
public class Activity {
@XmlElement(name="Archivo_fuente")
@XmlElement(name="Archivo_destino")
public Activity() {
}
this.source = source;
this.target = target;
}
return source;
}
public void setSource
(String source
) { this.source = source;
}
return target;
}
public void setTarget
(String target
) { this.target = target;
}
}
Como puedes ver, algunas etiquetas se repiten, en concreto
XmlAccessorType y es para indicar que los valores se accederán por medio de las propiedades.
NOTA: Para leer un archivo XML es importante que el atributo name de las propiedades sean idénticas al nombre del tag en el XML. De lo contrario, la conversión fallará.Ahora, veamos quien hace "la magia". Cabe aclarar que se hace un uso mínimo de
Generics para que la clase se adapte a cualquier entidad:.
MarshallerUtilpackage com.company.model.jaxb;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class MarshallerUtil<T> {
private static JAXBContext jaxbContext;
private final Class<T> clazz;
public MarshallerUtil(Class<T> aClazz) throws JAXBException {
this.clazz = aClazz;
jaxbContext = JAXBContext.newInstance(clazz);
}
public void marshal
(T entity,
File output
) throws JAXBException
{ Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(entity, output);
}
public T unmarshal
(File input
) throws JAXBException
{ Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (T) unmarshaller.unmarshal(input);
}
}
Donde:
- T: Es el tipo de clase (entidad) que será trabajada por el Marshaller (transformador).
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);: Formatea el XML.
- marshaller.marshall(entity, file): Recibe la entidad a convertir a XML y el destino (ruta) en un objeto File.
- marshaller.unmarshal(file): Recibe la ruta del XML a convertir. Con el cast hacia T decimos que el XML se convierta a la entidad con la que se está trabajando (T = MarshallerUtil<CLASE_DE_ENTIDAD>).
Por último, hagamos una prueba:
Main
package com.company.main;
import com.company.model.entities.Activity;
import com.company.model.entities.Management;
import com.company.model.entities.Process;
import com.company.model.jaxb.MarshallerUtil;
import com.sun.istack.internal.logging.Logger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.bind.JAXBException;
public class Main {
public static void main
(String[] args
) { Logger logger = Logger.getLogger(Main.class);
try {
/*Management management = new Management();
List<Process> processes = new ArrayList<>();
Collections.addAll(processes,
new Process(new Short("1"), "Proceso 1", new Short("1"),
new Activity("/home/gus/Documentos/origen.txt", "home/gus/Documentos")),
new Process(new Short("2"), "Proceso 2", new Short("4"),
new Activity("/home/gus/Documentos/origen.xml", "home/gus/Documentos")),
new Process(new Short("3"), "Proceso 3", new Short("3"),
new Activity("/home/gus/Documentos/origen.sh", "home/gus/Documentos"))
);
management.setVelocity(100.05d);
management.setProcesses(processes);
MarshallerUtil<Management> marshaller = new MarshallerUtil(Management.class);
marshaller.marshal(management, new java.io.File("/home/gus/Documentos/prueba1.xml"));*/
MarshallerUtil<Management> marshaller = new MarshallerUtil(Management.class);
Management management = marshaller
.
unmarshal(new java.
io.
File("/home/gus/Documentos/prueba.xml")); System.
out.
println(management.
getVelocity()); for(Process process
: management.
getProcesses()) { System.
out.
println(process.
getPid()); System.
out.
println(process.
getName()); System.
out.
println(process.
getQuantum()); System.
out.
println(process.
getActivity().
getSource()); System.
out.
println(process.
getActivity().
getTarget()); }
} catch (JAXBException e) {
logger.warning(e.getMessage());
}
}
}
La parte comentada es la forma para convertir una entidad a un fichero XML.
Resultado:100.0
1
Proceso1
2
@"C:\Users\Samir-PC\Documents\prueba1.txt"
@"C:\Users\Samir-PC\Documents"
2
Proceso2
1
@"C:\Users\Samir-PC\Documents\prueba2.txt"
@"C:\Users\Samir-PC\Documents"
3
Proceso3
4
@"C:\Users\Samir-PC\Documents\prueba3.txt"
@"C:\Users\Samir-PC\Documents"
4
Proceso4
3
@"C:\Users\Samir-PC\Documents\prueba4.txt"
@"C:\Users\Samir-PC\Documents"
¡Saludos!