这里需要注意几个注解
BaseMessage类
import lombok.Data; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlTransient; import java.util.Map; /** * @PackageName : com.rzk.pojo * @FileName : BaseMessage * @Description : 父类消息体 * @Author : rzk * @CreateTime : 19/1/2022 上午2:08 * @Version : v1.0 */ @Data public class BaseMessage { @XmlElement(name = "ToUserName") private String toUserName; @XmlElement(name = "FromUserName") private String fromUserName; @XmlElement(name = "CreateTime") private String createTime; @XmlElement(name = "MsgType") private String msgType; public BaseMessage() { } public BaseMessage(Map<String,String> requestMap) { this.toUserName = requestMap.get("ToUserName"); this.fromUserName = requestMap.get("FromUserName"); this.createTime = System.currentTimeMillis()/1000+""; } public String getToUserName() { return toUserName; } @XmlTransient public void setToUserName(String toUserName) { this.toUserName = toUserName; } public String getFromUserName() { return fromUserName; } @XmlTransient public void setFromUserName(String fromUserName) { this.fromUserName = fromUserName; } public String getCreateTime() { return createTime; } @XmlTransient public void setCreateTime(String createTime) { this.createTime = createTime; } public String getMsgType() { return msgType; } @XmlTransient public void setMsgType(String msgType) { this.msgType = msgType; } }
NewsInfoMessage 类 包含Articles数组
import javax.xml.bind.annotation.*; import java.util.List; import java.util.Map; /** * @PackageName : com.rzk.pojo * @FileName : NewsInfoMessage * @Description : * @Author : rzk * @CreateTime : 24/1/2022 上午1:03 * @Version : v1.0 */ @XmlRootElement(name = "xml") public class NewsInfoMessage extends BaseMessage { @XmlElement(name = "ArticleCount") private String articleCount; @XmlElement(name = "Articles") @XmlElementWrapper(name = "Articles")//使用list数组需要使用该注解,使下一级嵌套在该数组下 private List<Articles> articles; public NewsInfoMessage() { } public NewsInfoMessage(Map<String, String> requestMap, String articleCount, List<Articles> articles) { super(requestMap); setMsgType("news"); this.articleCount = articleCount; this.articles = articles; } public String getArticleCount() { return articleCount; } @XmlTransient public void setArticleCount(String articleCount) { this.articleCount = articleCount; } public List<Articles> getArticles() { return articles; } @XmlTransient public void setArticles(List<Articles> articles) { this.articles = articles; } @Override public String toString() { return "NewsInfoMessage{" + "articleCount='" + articleCount + '\'' + ", articles=" + articles + '}'; } }
Articles 类 包含Item
public class Articles { @XmlElement(name = "Item") private Item item; public Articles(Item item) { this.item = item; } public Articles() { } public Item getItem() { return item; } @XmlTransient public void setItem(Item item) { this.item = item; } @Override public String toString() { return "Articles{" + "item=" + item + '}'; } }
Item 类
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlTransient; /** * @PackageName : com.rzk.pojo * @FileName : Item * @Description : * @Author : rzk * @CreateTime : 24/1/2022 上午1:13 * @Version : v1.0 */ public class Item { @XmlElement(name = "title") private String title; @XmlElement(name = "Description") private String description; @XmlElement(name = "PicUrl") private String picUrl; @XmlElement(name = "Url") private String url; public Item() { } public Item(String title, String description, String picUrl, String url) { this.title = title; this.description = description; this.picUrl = picUrl; this.url = url; } public String getTitle() { return title; } @XmlTransient public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } @XmlTransient public void setDescription(String description) { this.description = description; } public String getPicUrl() { return picUrl; } @XmlTransient public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getUrl() { return url; } @XmlTransient public void setUrl(String url) { this.url = url; } @Override public String toString() { return "Item{" + "title='" + title + '\'' + ", description='" + description + '\'' + ", picUrl='" + picUrl + '\'' + ", url='" + url + '\'' + '}'; } }
/** * 对象转XML * @param obj 目标对象 * @return 返回string格式的xml报文 */ public static String objToXml(Object obj){ StringWriter sw = new StringWriter(); String result = null; try { //通过传入的类,创建该类的转换上下文 JAXBContext context = JAXBContext.newInstance(obj.getClass()); //创建实例 Marshaller marshaller = context.createMarshaller(); //格式化xml输出的格式,true会格式化输出,false会全部压缩到一起= marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); //是否打印xml的说明头 <?xml version="1.0" encoding="UTF-8" standalone="yes"> //设置为true表示不打印,设置为false表示打印,默认打印 marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.FALSE); //将对象转换成输出流形式的xml marshaller.marshal(obj,sw); result = sw.toString() ; } catch (JAXBException e) { logger.error("对象转XML异常:{}",e.getMessage()); e.printStackTrace(); }finally { try { sw.close(); } catch (IOException e) { e.printStackTrace(); } } return result; }
@Test void xmlTest() throws JAXBException { Map<String,String> map = new HashMap<>(); ArrayList<Articles> arrayList = new ArrayList<>(); Articles articles = new Articles(); map.put("ToUserName","to"); map.put("FromUserName","from"); map.put("MsgType","type"); Item item1 = new Item("英语", "1", "http://", "http://"); Item item2 = new Item("数学", "2", "http://", "http://"); Item item3 = new Item("政治", "3", "http://", "http://"); articles.setItem(item1); articles.setItem(item2); articles.setItem(item3); arrayList.add(articles); NewsInfoMessage msg = new NewsInfoMessage(map,"1",arrayList); System.out.println("打印iTem===>{}"+msg ); System.out.println("打印iTem===>{}"+BeanToXml.convertToXml(msg )); }
打印结果
打印iTem===>{}NewsInfoMessage{articleCount='1', articles=[Articles{item=Item{title='政治', description='3', picUrl='http://', url='http://'}}]} 打印iTem===>{}<xml> <ToUserName>to</ToUserName> <FromUserName>from</FromUserName> <CreateTime>1643046829</CreateTime> <MsgType>news</MsgType> <ArticleCount>1</ArticleCount> <Articles> <Articles> <Item> <title>政治</title> <Description>3</Description> <PicUrl>http://</PicUrl> <Url>http://</Url> </Item> </Articles> </Articles> </xml>