unmarshal parse online marshal jaxbunmarshaller jaxbcontext example bean java xml jaxb unmarshalling

parse - unmarshal java



Jaxb Unmarshall con un @XmlRootElement desconocido (2)

No puedo lograr separar un XML sin conocer el elemento raíz. p.ej.

<foo> <bar/> </foo>

o

<bar> <bar/> </bar>

etc ...

Quiero mapear el resultado de descalificación en una clase como:

// @XmlRootElement ?? public class Container implements Serializable { private Bar bar; }

Siempre se me solicita que corrija @XmlRootElement .
Busqué cómo establecer @XmlRootElement en tiempo de ejecución sin éxito. ¿Alguna idea?

Estoy en el contexto de Spring Batch y puedo usar el unmarshaller de mi elección.

Nota: No puedo usar @XmlElementDecl o ObjectFactory como se muestra aquí porque no sé el nombre de los posibles nombres de raíz .


Cualquiera que sea XML, su pase tiene elementos raíz, xml que mencionó tiene dos archivos

<foo> <bar/> </foo>

o

<bar> <bar/>

así que aquí tienes dos nombres de raíz foo o bar, así que crea dos clases para cada uno, si alguna vez el nombre de raíz llamará a esa clase


Se adaptó su enfoque: https://.com/a/33824472/181336

import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.transform.stream.StreamSource; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Serializable; public class Test { @XmlAccessorType(XmlAccessType.PROPERTY) public static class Bar { private String name; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } } @XmlAccessorType(XmlAccessType.PROPERTY) public static class Container implements Serializable { private Bar bar; public Bar getBar() { return bar; } @XmlElement public void setBar(Bar bar) { this.bar = bar; } } public static void main(String[] args) throws Exception { JAXBContext jaxbContext = JAXBContext.newInstance(Container.class); String xml = "<foo><bar><name>Barry</name></bar></foo>"; Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); InputStream is = new ByteArrayInputStream(xml.getBytes()); JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class); Container container = barWrapperElement.getValue(); System.out.println(container.getBar().getName()); } }

¡Funciona!