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.