java将xml转成对象是如此轻松-Unmarshaller

来源:互联网 发布:最好的字体设计软件 编辑:程序博客网 时间:2024/05/18 20:53

dom解析和sax解析都是小儿科,今天这个Marshaller和Unmarshaller才是真正的xml解析神器,非常叼。大家准备好跟我一起摇摆了吗??咱们先把道具上了,一个xml文件

Girl.xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2. <root>  
  3. <girl><name>lily</name><cup>D</cup><age>18</age></girl>  
  4. <girl><name>lucy</name><cup>F</cup><age>20</age></girl>  
  5. <girl><name>lisa</name><cup>a</cup><age>17</age></girl>  
  6. </root>  
 好了,大家看到这个文件了,我们必须搞一个类,叫Girl,然后读这个xml,一共读到三个对象,然后输出来,先定义一个Girl,并且写一个toString方法:

 

Java代码  收藏代码
  1. @XmlAccessorType(XmlAccessType.FIELD)    
  2. class Girl {  
  3.       
  4.     @XmlElement(name = "name")  
  5.     private String name;  
  6.       
  7.     @XmlElement(name = "age")  
  8.     private String age;  
  9.       
  10.     @XmlElement(name = "cup")  
  11.     private String cup;  
  12.       
  13.     public String toString(){  
  14.       return name+","+age+","+cup+"\n";  
  15.     }  
  16.       
  17.     public String getAge() {return age;}  
  18.     public void setAge(String age) {this.age = age;}  
  19.     public String getName() {return name;}  
  20.     public void setName(String name) {this.name = name;}  
  21.     public String getCup() {return cup;}  
  22.     public void setCup(String cup) {this.cup = cup;}  
  23. }  

 

因为我们是拿一个List的,但是我们发现unmarshal()这个方法返回的是一个Object,而且我们本身也是要先拿root下面的所有girl标签的,所以,咱们可以搞一个Root类,并且我们写一个toString的方法:

Java代码  收藏代码
  1. @XmlAccessorType(XmlAccessType.FIELD)    
  2. @XmlRootElement(name = "root")    
  3. class Root{  
  4.     @XmlElement(name = "girl")    
  5.     private List<Girl> girls;  
  6.       
  7.     public String toString(){  
  8.         StringBuilder sb=new StringBuilder();  
  9.         for(Girl girl:girls){  
  10.             sb.append(girl.toString());  
  11.         }  
  12.         return sb.toString();  
  13.     }  
  14.   
  15.     public List<Girl> getGirls() {return girls;}  
  16.     public void setGirls(List<Girl> girls) {this.girls = girls;}  
  17. }  

 好了,这些底层的工作做好以后,让他跑起来瞧瞧吧!!

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.     try {  
  3.           File file = new File("D:\\fileDemo\\girl.xml");  
  4.           JAXBContext jaxbC = JAXBContext.newInstance(Root.class);  
  5.           Unmarshaller us = jaxbC.createUnmarshaller();  
  6.           Root root=(Root)us.unmarshal(file);  
  7.           System.out.println(root.toString());  
  8.          } catch (JAXBException e) {  
  9.             e.printStackTrace();  
  10.         }  
  11.     }  

 

看看运行结果:

Html代码  收藏代码
  1. lily,18,D  
  2. lucy,20,F  
  3. lisa,17,a  

 

帅!!!!!!

 

稍微总结一下,怎么用Unmarshaller去解析咱们的xml文件。

 

1、从最里层开始(girl),把我们想要的节点标记好了:@XmlElement(name = "xxx"),并且给出他的get,set方法。

     同时,要给Girl这个class加上@XmlAccessorType(XmlAccessType.FIELD) ,表示使用这个类中的 private 非静态字段作为 XML 的序列化的属性或者元素。  也就是说,咱们把里边的Girl类中的name来表示xml文件中的name,非常简单。当然,我们需要在name的头上加一顶小帽子:

    @XmlElement(name = "name")

 

2、但是我们惊人得发现: JAXBContext.newInstance()这个方法必须要传进来一个class,同时我们的返回结果也只是一个Object,那咋整呢?机智的我想出一个绝世的好办法:再建一个类,用来存放 List<Girl>这样不就OK了?

 

3、调用的时候分三步:

 a、 获取一个jaxbcontent的实例

 b、 jabccontent创建一个Unmarshaller对象

 c、 执行ummarshal方法

       

Java代码  收藏代码
  1. a、JAXBContext jaxbC = JAXBContext.newInstance(Root.class);  
  2. b、Unmarshaller us = jaxbC.createUnmarshaller();  
  3. c、Root root=(Root)us.unmarshal(file);  

    

 

好了,明天再给大家演示这个怎么把对象搞成xml  

原创粉丝点击