加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

jaxb2与xml之间相互转换

发布时间:2020-12-15 23:49:38 所属栏目:百科 来源:网络整理
导读:jaxb2与xml之间相互转换 分类: jaxb与xml转换 2011-12-16 22:51 69人阅读 评论(0) 收藏 举报 什么是JAXB? URL url = (new URI("http://shz01d007:9025/adviser/100241/accounts")).toURL(); AccountTestList content = (AccountTestList) unMarshal.unmarsh
jaxb2与xml之间相互转换 分类: jaxb与xml转换 2011-12-16 22:51 69人阅读 评论(0) 收藏 举报 什么是JAXB? URL url = (new URI("http://shz01d007:9025/adviser/100241/accounts")).toURL(); AccountTestList content = (AccountTestList) unMarshal.unmarshal(url); System.out.println(content.toString()); @XmlRootElement(name = "accounts") public class AccountTestList extends ArrayList<AccountTest> { @XmlElementRef(type = AccountTest.class) public List<AccountTest> getAccountTest() { return this; } } @XmlRootElement(name = "account") public class AccountTest { private String id; private String acctName; /** * @return the id */ public String getId() { return id; } /** * @param id the id to set */ public void setId(String id) { this.id = id; } /** * @return the acctName */ public String getAcctName() { return acctName; } /** * @param acctName the acctName to set */ public void setAcctName(String acctName) { this.acctName = acctName; } } Java Architecture for XML Binding (JAXB)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。 这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAX或DOM。JAXB隐藏了细节并且取消了SAX和DOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。 JAXB2使用了JDK的新特性。如:Annotation、GenericType等,Jaxb2需要在即将转换的JavaBean中添加annotation注解。下面我们就来看看Jaxb2是怎么样完成Java对象到XML之间的相互转换的吧。 [java] view plaincopy @XmlRootElement(name="bean") public class Info implements Serializable { private int id; private String name; private String email; @XmlAttribute(name="num") public int getId() { return id; } public void setId(int id) { this.id = id; } @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } [java] view plaincopy @Test public void testObject() { Info info = new Info(); info.setId(1); info.setName("allan"); info.setEmail("tom@tom.com"); try { JAXBContext context = JAXBContext.newInstance(Info.class); Marshaller marshal = context.createMarshaller(); StringWriter writer = new StringWriter(); marshal.marshal(info,writer); System.out.println(writer); Unmarshaller unMarshal = context.createUnmarshaller(); StringReader reader = new StringReader(writer.toString()); Info content = (Info) unMarshal.unmarshal(reader); System.out.println("ID:" + content.getId() + "n名字:" + content.getName() + "nemail:" + content.getEmail()); } catch (JAXBException e) { e.printStackTrace(); } } 上面一段是JavaBean和XML的相互转换,传递了一个Info.class,这个Info不是一般的普通的bean。除了它带有getter、setter方法外,还有Annotation注解。 上面的XmlRootElement是设置当前对象转换成xml后的根节点,name的值是设置根节点的名称。在getter方法上设置XmlElement表示这个方法对应的属性是一个xml元素,如果这个注解还设置了name,那么这个name就是转换后xml的名称。在一个属性上设置XmlAttribute,表示这个方法对应的属性在转换xml后是父元素的一个属性。XmlAttribute的name就是转换后xml的属性的name。 [java] view plaincopy @XmlRootElement(name="list-beans") public class ListBean { private List<Object> list; private String name; @XmlElements({ @XmlElement(name="bean",type=Info.class) }) public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } @XmlAttribute public String getName() { return name; } public void setName(String name) { this.name = name; } } [java] view plaincopy @Test public void testList() { List<Object> list = new ArrayList<Object>(); Info info = new Info(); info.setId(1); info.setName("allan"); info.setEmail("tom@tom.com"); Info info2 = new Info(); info2.setId(2); info2.setName("allan2"); info2.setEmail("tom2@tom.com"); list.add(info); list.add(info2); ListBean listBean = new ListBean(); listBean.setName("list to xml"); listBean.setList(list); try { JAXBContext context = JAXBContext.newInstance(ListBean.class); Marshaller marshal = context.createMarshaller(); StringWriter writer = new StringWriter(); marshal.marshal(listBean,writer); System.out.println(writer); Unmarshaller unMarshal = context.createUnmarshaller(); StringReader reader = new StringReader(writer.toString()); ListBean content = (ListBean) unMarshal.unmarshal(reader); System.out.println(content.getName()); } catch (JAXBException e) { e.printStackTrace(); } } 上面一段是List和XML的相互转换 XmlElements表示是一个集合类型,然后注解在集合中存放上面类型的对象。 XmlElement表示在集合中存放的一个对象类型和元素名称。 [java] view plaincopy @XmlRootElement(name="map-beans") public class MapBean { Map<String,Info> map; @XmlJavaTypeAdapter(MapAdapter.class) public Map<String,Info> getMap() { return map; } public void setMap(Map<String,Info> map) { this.map = map; } } [java] view plaincopy public class MapElement { /*@XmlElement public String key; @XmlElement public Info value; public MapElement() { } public MapElement(String key,Info value) { super(); this.key = key; this.value = value; }*/ private String key; private Info value; private MapElement() { } public MapElement(String key,Info value) { super(); this.key = key; this.value = value; } @XmlElement public String getKey() { return key; } public void setKey(String key) { this.key = key; } @XmlElement public Info getValue() { return value; } public void setValue(Info value) { this.value = value; } } [java] view plaincopy public class MapAdapter extends XmlAdapter<MapElement[],Map<String,Info>>{ @Override public Map<String,Info> unmarshal(MapElement[] param) throws Exception { Map<String,Info> map=new HashMap<String,Info>(); for (MapElement element:param) { //map.put(element.key,element.value); map.put(element.getKey(),element.getValue()); } return map; } @Override public MapElement[] marshal(Map<String,Info> param) throws Exception { MapElement[] element=new MapElement[param.size()]; int i=0; for (Map.Entry<String,Info> entry: param.entrySet()) { element[i++]=new MapElement(entry.getKey(),entry.getValue()); } return element; } } [java] view plaincopy @Test public void testMap() { MapBean mapBean = new MapBean(); Info info = new Info(); info.setId(1); info.setName("allan"); info.setEmail("tom@tom.com"); Info info2 = new Info(); info2.setId(2); info2.setName("allan2"); info2.setEmail("tom2@tom.com"); Map<String,Info> map = new HashMap<String,Info>(); map.put("NO1",info); map.put("NO2",info2); mapBean.setMap(map); try { JAXBContext context = JAXBContext.newInstance(MapBean.class); Marshaller marshal = context.createMarshaller(); StringWriter writer = new StringWriter(); //按照jaxb的格式输出 marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE); marshal.marshal(mapBean,writer); System.out.println(writer); Unmarshaller unMarshal = context.createUnmarshaller(); StringReader reader = new StringReader(writer.toString()); MapBean content = (MapBean) unMarshal.unmarshal(reader); System.out.println(content.getMap().size()); } catch (JAXBException e) { e.printStackTrace(); } } 上面的map集合的getter方法有一个XmlJavaTypeAdapter,需要传递一个Adapter的类型。 完整代码下载地址:http://download.csdn.net/detail/allan_chan/3931401

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读