Mi duda es la siguiente.
Tengo un fichero xml valido para un schema que tengo en una aplicacion java.
La idea es abril ese fichero xml, que contiene datos concretos, añadir un nuevo elemento, en este caso un alumno nuevo, y volver a guardarlo.
caputara del archivo xml
<?xml version="1.0" encoding="UTF-8"?>
<Curso xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="clase.xsd">
<profesor>
<nombre>Juan Fernandez</nombre>
<asignatura>Java</asignatura>
<especialidad>Programacion</especialidad>
<curso>2014/2015</curso>
<modalidad>eLearnig</modalidad>
</profesor>
<comentario>Sin comentario</comentario>
<alumnos>
<alumno>
<nombreAlumno>Frank de la jungla</nombreAlumno>
<edad>40</edad>
<direccion>Thailandia</direccion>
<comentario>Intrepido aventurero</comentario>
<telefono>556999111</telefono>
</alumno>
<alumno>
<nombreAlumno>Mariano Rajoy</nombreAlumno>
<edad>65</edad>
<direccion>Palacio de la Moncloa</direccion>
<comentario>Sin comentarios!!</comentario>
<telefono>651325896</telefono>
</alumno>
<alumno>
<nombreAlumno>Stepehen Hawkins</nombreAlumno>
<edad>79</edad>
<direccion>Cambrige</direccion>
<comentario>The boss</comentario>
<telefono>856321569</telefono>
</alumno>
</alumnos>
</curso>
captura del programa
public class JABX_clase {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
try {
//Creamos una instancia de la clase JABXContext para manipular las
//clases que contiene, extraidas del schema curso.xsd
JAXBContext jaxbContext = JAXBContext.newInstance("generated");
//Objeto de tipo unmarshall para convertir los tipo xml en objetos java
Unmarshaller u = jaxbContext.createUnmarshaller();
//JAXBElement para obtener elementos del documento xml
JAXBElement jaxbElement = (JAXBElement) u.unmarshal(
new FileInputStream("/home/dib_vz/claseA.xml"));
//metodo para obtener el modelo de contenido y el valor de los atributos
CursoType cursoType = (CursoType) jaxbElement.getValue();
// Aqui es donde no se como seguir, para añadir nuevos elementos de tipo
// alumno
//
Marshaller m = jaxbContext.createMarshaller();
//
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
//
m.marshal(jaxbElement, System.out);
} catch (JAXBException je) {
System.out.println(je.getCause());
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
}
}
captura de la clase Alumnos
public class Alumnos {
@XmlElement(required = true)
protected List<Alumnos.Alumno> alumno;
/**
* Gets the value of the alumno property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the alumno property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAlumno().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Alumnos.Alumno }
*
*
* @return
*/
public List<Alumnos.Alumno> getAlumno() {
if (alumno == null) {
alumno = new ArrayList<>();
}
return this.alumno;
}
public void setNombreAlumno(String hola) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void setEdad(String string) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
/**
* <p>Clase Java para anonymous complex type.
*
* <p>El siguiente fragmento de esquema especifica el contenido que se espera que haya en esta clase.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="nombreAlumno" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="edad">
* <simpleType>
* <restriction base="{http://www.w3.org/2001/XMLSchema}positiveInteger">
* <maxExclusive value="100"/>
* </restriction>
* </simpleType>
* </element>
* <element name="direccion" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element ref="{}comentario" minOccurs="0"/>
* <element name="telefono" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"nombreAlumno",
"edad",
"direccion",
"comentario",
"telefono"
})
public static class Alumno {
@XmlElement(required = true)
protected String nombreAlumno;
protected int edad;
@XmlElement(required = true)
protected String direccion;
protected String comentario;
@XmlElement(required = true)
@XmlSchemaType(name = "positiveInteger")
protected BigInteger telefono;
/**
* Obtiene el valor de la propiedad nombreAlumno.
*
* @return
* possible object is
* {@link String }
*
*/
public String getNombreAlumno() {
return nombreAlumno;
}
/**
* Define el valor de la propiedad nombreAlumno.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setNombreAlumno(String value) {
this.nombreAlumno = value;
}
/**
* Obtiene el valor de la propiedad edad.
*
* @return
*/
public int getEdad() {
return edad;
}
/**
* Define el valor de la propiedad edad.
*
* @param value
*/
public void setEdad(int value) {
this.edad = value;
}
/**
* Obtiene el valor de la propiedad direccion.
*
* @return
* possible object is
* {@link String }
*
*/
public String getDireccion() {
return direccion;
}
/**
* Define el valor de la propiedad direccion.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setDireccion(String value) {
this.direccion = value;
}
/**
* Obtiene el valor de la propiedad comentario.
*
* @return
* possible object is
* {@link String }
*
*/
public String getComentario() {
return comentario;
}
/**
* Define el valor de la propiedad comentario.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setComentario(String value) {
this.comentario = value;
}
/**
* Obtiene el valor de la propiedad telefono.
*
* @return
* possible object is
* {@link BigInteger }
*
*/
public BigInteger getTelefono() {
return telefono;
}
/**
* Define el valor de la propiedad telefono.
*
* @param value
* allowed object is
* {@link BigInteger }
*
*/
public void setTelefono(BigInteger value) {
this.telefono = value;
}
}