jaxb2与xml之间相互转换

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("[email protected]"); 
    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("[email protected]"); 
    Info info2 = new Info(); 
    info2.setId(2); 
    info2.setName("allan2"); 
    info2.setEmail("[email protected]"); 
    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("[email protected]"); 
    Info info2 = new Info(); 
    info2.setId(2); 
    info2.setName("allan2"); 
    info2.setEmail("[email protected]"); 
    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

猜你喜欢

转载自rainyear.iteye.com/blog/1661998
今日推荐