使用SAX解析将xml的文件保存为java对象



转载自: http://blog.csdn.net/kingsonyoung/article/details/5199508

Java使用Sax解析xml文件中,我们介绍了如何用SAX解析xml文件,接下来我们继续学习如何将一个xml文件的内容结构保存到一个java实例对象中

一、xml文件如下

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <bookstore>  
  3.     <book id="156">  
  4.         <name>计算机网络</name>  
  5.         <author>谢希仁</author>  
  6.         <price>39</price>  
  7.         <year>2013</year>  
  8.     </book>  
  9.     <book id="234">  
  10.         <name>计算机操作系统</name>  
  11.         <author>佚名</author>  
  12.         <price>40</price>  
  13.         <year>2013</year>  
  14.         <edition>第四版</edition>  
  15.     </book>  
  16.     <book id="367">  
  17.         <name>计算机组成原理</name>  
  18.         <price>35</price>  
  19.         <year>2013</year>  
  20.         <edition>第三版</edition>  
  21.     </book>  
  22. </bookstore>  



二、首先,我们要想写一个与xml中的book节点结构相同的 实体类Book

[java]  view plain  copy
  1. public class Book {  
  2.     private String id;  
  3.     private String name;  
  4.     private String author;  
  5.     private String price;  
  6.     private String year;  
  7.     private String edition;  
  8.   
  9.     public String getId() {  
  10.         return id;  
  11.     }  
  12.   
  13.     public void setId(String id) {  
  14.         this.id = id;  
  15.     }  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     public String getAuthor() {  
  26.         return author;  
  27.     }  
  28.   
  29.     public void setAuthor(String author) {  
  30.         this.author = author;  
  31.     }  
  32.   
  33.     public String getPrice() {  
  34.         return price;  
  35.     }  
  36.   
  37.     public void setPrice(String price) {  
  38.         this.price = price;  
  39.     }  
  40.   
  41.     public String getYear() {  
  42.         return year;  
  43.     }  
  44.   
  45.     public void setYear(String year) {  
  46.         this.year = year;  
  47.     }  
  48.   
  49.     public String getEdition() {  
  50.         return edition;  
  51.     }  
  52.   
  53.     public void setEdition(String edition) {  
  54.         this.edition = edition;  
  55.     }  
  56.   
  57.     @Override  
  58.     public String toString() {  
  59.         return "Book [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + ", year=" + year  
  60.                 + ", edition=" + edition + "]";  
  61.     }  
  62.   
  63. }  


三、编写DefaultHandler类

使用全局变量来实现不同函数之间的对象共享

[java]  view plain  copy
  1. public class MyHandler extends DefaultHandler {  
  2.     private String value = null;  
  3.     private List<Book> bookList = new ArrayList<>();  
  4.     private Book book = null;  
  5.   
  6.     @Override  
  7.     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
  8.         super.startElement(uri, localName, qName, attributes);  
  9.         if ("book".equals(qName)) {  
  10.             book = new Book();  
  11.             String id = attributes.getValue("id");  
  12.             book.setId(id);  
  13.         }  
  14.     }  
  15.   
  16.     @Override  
  17.     public void characters(char[] ch, int start, int length) throws SAXException {  
  18.         super.characters(ch, start, length);  
  19.         value = new String(ch, start, length);  
  20.   
  21.     }  
  22.   
  23.     @Override  
  24.     public void endElement(String uri, String localName, String qName) throws SAXException {  
  25.         super.endElement(uri, localName, qName);  
  26.         switch (qName) {  
  27.         case "book":  
  28.             bookList.add(book);  
  29.             book = null;  
  30.             break;  
  31.         case "name":  
  32.             book.setName(value);  
  33.             break;  
  34.         case "author":  
  35.             book.setAuthor(value);  
  36.         case "year":  
  37.             book.setYear(value);  
  38.             break;  
  39.         case "edition":  
  40.             book.setEdition(<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">value</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">);</span>  
  41.             break;  
  42.         case "price":  
  43.             book.setPrice(value);  
  44.             break;  
  45.         }  
  46.     }  
  47.   
  48.     public List<Book> getBookList() {  
  49.         return bookList;  
  50.     }  
  51.   
  52.     public void setBookList(List<Book> bookList) {  
  53.         this.bookList = bookList;  
  54.     }  
  55.   
  56. }  



四、编写主函数

[java]  view plain  copy
  1. public class SaxXmlParser {  
  2.     public static void main(String[] args) {  
  3.         // 创建SAXParserFactory实例  
  4.         SAXParserFactory spf = SAXParserFactory.newInstance();  
  5.         try {  
  6.             // 创建SAXParser实例  
  7.             SAXParser parser = spf.newSAXParser();  
  8.             // 创建DefaultHandler实例  
  9.             MyHandler handler = new MyHandler();  
  10.             // 开始解析  
  11.             parser.parse("book.xml", handler);  
  12.             for (Book book : handler.getBookList()) {  
  13.                 System.out.println(book);  
  14.             }  
  15.         } catch (ParserConfigurationException | SAXException e) {  
  16.             // TODO Auto-generated catch block  
  17.             e.printStackTrace();  
  18.         } catch (IOException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23. }  


五、控制台输出结果如下

[plain]  view plain  copy
  1. Book [id=156, name=计算机网络, author=谢希仁, price=39, year=2013, edition=null]  
  2. Book [id=234, name=计算机操作系统, author=佚名, price=40, year=2013, edition=第四版]  
  3. Book [id=367, name=计算机组成原理, author=null, price=35, year=2013, edition=第三
  4. 版]  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值