dom解析和sax解析都是小儿科,今天这个Marshaller和Unmarshaller才是真正的xml解析神器,非常叼。大家准备好跟我一起摇摆了吗??咱们先把道具上了,一个xml文件
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <root>
- <girl><name>lily</name><cup>D</cup><age>18</age></girl>
- <girl><name>lucy</name><cup>F</cup><age>20</age></girl>
- <girl><name>lisa</name><cup>a</cup><age>17</age></girl>
- </root>
- @XmlAccessorType(XmlAccessType.FIELD)
- class Girl {
- @XmlElement(name = "name")
- private String name;
- @XmlElement(name = "age")
- private String age;
- @XmlElement(name = "cup")
- private String cup;
- public String toString(){
- return name+","+age+","+cup+"\n";
- }
- public String getAge() {return age;}
- public void setAge(String age) {this.age = age;}
- public String getName() {return name;}
- public void setName(String name) {this.name = name;}
- public String getCup() {return cup;}
- public void setCup(String cup) {this.cup = cup;}
- }
因为我们是拿一个List的,但是我们发现unmarshal()这个方法返回的是一个Object,而且我们本身也是要先拿root下面的所有girl标签的,所以,咱们可以搞一个Root类,并且我们写一个toString的方法:
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlRootElement(name = "root")
- class Root{
- @XmlElement(name = "girl")
- private List<Girl> girls;
- public String toString(){
- StringBuilder sb=new StringBuilder();
- for(Girl girl:girls){
- sb.append(girl.toString());
- }
- return sb.toString();
- }
- public List<Girl> getGirls() {return girls;}
- public void setGirls(List<Girl> girls) {this.girls = girls;}
- }
好了,这些底层的工作做好以后,让他跑起来瞧瞧吧!!
- public static void main(String[] args) {
- try {
- File file = new File("D:\\fileDemo\\girl.xml");
- JAXBContext jaxbC = JAXBContext.newInstance(Root.class);
- Unmarshaller us = jaxbC.createUnmarshaller();
- Root root=(Root)us.unmarshal(file);
- System.out.println(root.toString());
- } catch (JAXBException e) {
- e.printStackTrace();
- }
- }
看看运行结果:
- lily,18,D
- lucy,20,F
- 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方法
- a、JAXBContext jaxbC = JAXBContext.newInstance(Root.class);
- b、Unmarshaller us = jaxbC.createUnmarshaller();
- c、Root root=(Root)us.unmarshal(file);
好了,明天再给大家演示这个怎么把对象搞成xml