Saltar al contenido

leer archivo Xml con JAXB

Nuestros mejores desarrolladores agotaron sus depósitos de café, en su búsqueda diariamente por la respuesta, hasta que Angélica encontró la solución en Gitea y ahora la comparte con nosotros.

Solución:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"config"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:631)

Debe asegurarse de asociar una clase con el elemento raíz del documento XML utilizando @XmlRootElement o @XmlElementDecl (ver: http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html). Alternativamente, puede usar uno de los métodos de desmarshal que toman un Class parámetro para decirle a JAXB qué tipo de objeto está desarmando.


Modelo de dominio (Configuración)

Recomendaría tener una clase de dominio como la siguiente desde la cual podría obtener las dos listas de Property objetos.

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

@XmlRootElement
public class Config 

    private List logProperties = new ArrayList();
    private List envProperties = new ArrayList();

    @XmlElementWrapper(name="log")
    @XmlElement(name="property")
    public List getLogProperties() 
        return logProperties;
    

    @XmlElementWrapper(name="env")
    @XmlElement(name="property")
    public List getEnvProperties() 
        return envProperties;
    


Manifestación

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

public class Demo 

    public static void main(String[] args) throws Exception 
        JAXBContext jc = JAXBContext.newInstance(Config.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17059227/input.xml");
        Config config = (Config) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "file:///C:/Documents%20and%20Settings/mojalal/Desktop/FirstXSD.xml");
        marshaller.marshal(config, System.out);
    


entrada.xml/Salida



    
        
        
    
    
        
        
        
    

Cuando describa un modelo XML, debe comenzar con una entidad raíz (en su caso, es el elemento).

@XmlRootElement(name="config")
class Config implements Serializable 
   private Log log;
   private Env env;

   @XmlElement(name="log")
   public Log getLog() 
      return this.log;
   

   @XmlElement(name="env")
   public Env getEnv() 
      return this.env;
   

   // Setters are omitted

Y luego analizas el XML de la siguiente manera:

JAXBContext jaxbContext = JAXBContext.newInstance(Config.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Config config = (Config) jaxbUnmarshaller.unmarshal(file);
if (config != null && config.getLog() != null) 
   customer = config.getLog().getProperties();

Calificaciones y reseñas

Te invitamos a sustentar nuestra ocupación fijando un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *