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!