如何解决jaxb按类型解组到对象
我想基于xml解析不同的类型,例如,当header = 1然后是User,header = 2然后是Order等。
<entity>
<header>1</header>
<body>
<userId>1</userId>
<userName>jonh</userName>
...
<body>
</entity>
<entity>
<header>2</header>
<body>
<orderId>1</orderId>
<orderNo>20200101</orderNo>
...
<body>
</entity>
如何实现此功能?
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object object = unmarshaller.unmarshal(xml);
解决方法
我会尝试:在解组时提供类型。因此,也许可以执行以下操作:创建一个临时外观对象:
public class XmlEntityFacade {
private int header;
private Object body;
//getters and setters...
}
然后在解组时强制转换此类型:
...
XmlEntityFacade facade = (XmlEntityFacade) unmarshaller.unmarshal(xml);
然后,您可以通过调用.getHeader()和带有.getBody()的正文(您已提供XmlEntityFacade类的getter)来访问的值。然后根据值将所需的类型强制转换为对象。
,public class TwiceUnmarshalTest {
@Data
@ToString
public static abstract class HeaderResponse {
private String header;
}
@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public static class XmlHeaderResponse extends HeaderResponse {
}
private final String xml = "<entity>" +
" <header>2</header>" +
" <body>" +
" <orderId>1</orderId>" +
" <orderNo>2020</orderNo>" +
" </body>" +
"</entity>";
@SuppressWarnings("unchecked")
public static <T> T unmarshal(Reader reader,Class<T> typeClass) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(typeClass);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (T) unmarshaller.unmarshal(reader);
}
@Test
public void headerResponse() throws Exception {
HeaderResponse response = unmarshal(new StringReader(xml),XmlHeaderResponse.class);
System.out.println(response);
}
@ToString(callSuper = true)
public static abstract class Response<T> extends HeaderResponse {
@XmlAnyElement(lax = true)
public T body;
}
@Data
@XmlRootElement(name = "body")
public static class Order {
private String orderId;
private String orderNo;
}
@XmlRootElement(name = "entity")
@XmlSeeAlso({Order.class})
public static class OrderResponse extends Response<Order> {
}
@Test
public void response() throws Exception {
XmlHeaderResponse response = unmarshal(new StringReader(xml),XmlHeaderResponse.class);
System.out.println(response);
//TwiceUnmarshalTest.HeaderResponse(header=2)
if (response.getHeader().equals("2")) {
OrderResponse orderResponse = unmarshal(new StringReader(xml),OrderResponse.class);
System.out.println(orderResponse);
//TwiceUnmarshalTest.Response(super=TwiceUnmarshalTest.HeaderResponse(header=2),body=TwiceUnmarshalTest.Order(orderId=1,orderNo=2020))
}
}
}
解组两次,只需先获取标头,然后获取实体。不太好,但是可以使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。