1. 程式人生 > >sax解析xml檔案(三)

sax解析xml檔案(三)

在實際開發中,我們經常需要將資料庫的一條記錄,封裝成bean,然後儲存到集合裡面.

那麼,我們也可以利sax 將xml檔案中的結點封裝到bean裡,然後儲存到集合裡.下面以前面兩篇中的users.xml為例,總結下

xml檔案users.xml如下:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <users>
  3. <userid="001">
  4. <username>james</username>
  5. <password>javajsp</password>
  6. </user>
  7. <user
    id="002">
  8. <username>adu</username>
  9. <password>adu</password>
  10. </user>
  11. <userid="003">
  12. <username>root</username>
  13. <password>root</password>
  14. </user><userid="004">
  15. <username>lishanli</username>
  16. <password>lishanli</password>
  17. </user>
  18. </users>

先設計好bean實體,程式碼如下:

  1. package org.james.pojo;
  2. publicclass UserInfo {
  3. private String username;
  4. private String password;
  5. private String id;
  6. public String getUsername() {
  7. return username;
  8.     }
  9. publicvoid setUsername(String username) {
  10. this.username = username;
  11.     }
  12. public String getPassword() {
  13. return password;
  14.     }
  15. publicvoid setPassword(String password) {
  16. this.password = password;
  17.     }
  18. public String getId() {
  19. return id;
  20.     }
  21. publicvoid setId(String id) {
  22. this.id = id;
  23.     }
  24. }

建立DefaultHandler,依然,利用sax解析xml和stack結構相似的技巧.程式碼如下:

  1. package org.james.sax.util;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Stack;
  5. import org.james.pojo.UserInfo;
  6. import org.xml.sax.Attributes;
  7. import org.xml.sax.SAXException;
  8. import org.xml.sax.helpers.DefaultHandler;
  9. publicclass AllUserHandler extends DefaultHandler {
  10. private List<UserInfo> list=new ArrayList<UserInfo>();
  11. private UserInfo uiobj;
  12. private Stack<String> sta=new Stack<String>();
  13. @Override
  14. publicvoid characters(char[] ch, int start, int length)
  15. throws SAXException {
  16. if(!sta.empty()){
  17.             String name=sta.peek();
  18. if("username".equals(name)){
  19.                 uiobj.setUsername(new String(ch,start,length));
  20.             }elseif("password".equals(name)){
  21.                 uiobj.setPassword(new String(ch,start,length));
  22.             }
  23.         }
  24.     }
  25. @Override
  26. publicvoid endElement(String uri, String localName, String name)
  27. throws SAXException {
  28. if("username".equals(name)){
  29.             sta.pop();
  30.         }elseif("password".equals(name)){
  31.             sta.pop();
  32.         }elseif("user".equals(name)){
  33.             list.add(uiobj);
  34.             uiobj=null;
  35.             sta.pop();
  36.         }
  37.     }
  38. @Override
  39. publicvoid startElement(String uri, String localName, String name,
  40.             Attributes attributes) throws SAXException {
  41. if(attributes!=null){
  42.             String id=attributes.getValue("id");
  43. if(id!=null){
  44.                 uiobj=new UserInfo();
  45.                 uiobj.setId(id);
  46.             }
  47.         }
  48. if("user".equals(name)){
  49.             sta.push(name);
  50.         }elseif("username".equals(name)){
  51.             sta.push(name);
  52.         }elseif("password".equals(name)){
  53.             sta.push(name);
  54.         }
  55.     }
  56. public List<UserInfo> getList() {
  57. return list;
  58.     }
  59. }

測試類,沿用UserService.稍作修改.如下:

  1. package org.james.sax;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import org.james.pojo.UserInfo;
  9. import org.james.sax.util.AllUserHandler;
  10. import org.james.sax.util.IsExistedUserHandler;
  11. import org.james.sax.util.ValidateLoginHandler;
  12. import org.xml.sax.SAXException;
  13. publicclass UserService {
  14. privatestatic InputStream IN =UserService.class.getClassLoader().getResourceAsStream("users.xml");
  15. private SAXParser saxParser;
  16. public UserService(){
  17. try {
  18.             saxParser=SAXParserFactory.newInstance().newSAXParser();
  19.         } catch (ParserConfigurationException e) {
  20.             e.printStackTrace();
  21.         } catch (SAXException e) {
  22.             e.printStackTrace();
  23.         }
  24.     }
  25. publicboolean isExistedUser(String id){
  26.         IsExistedUserHandler ieuh=new IsExistedUserHandler (id);
  27. try {
  28.             saxParser.parse(IN, ieuh);
  29.         } catch (SAXException e) {
  30.             System.out.println(e.getMessage());
  31. returntrue;
  32.         } catch (IOException e) {
  33.             e.printStackTrace();
  34.         }
  35. returnfalse;
  36.     }
  37. publicboolean validateLogin(String username,String password){
  38.         ValidateLoginHandler vlh=new ValidateLoginHandler(username,password);
  39. try {
  40.             saxParser.parse(IN, vlh);
  41.         } catch (SAXException e) {
  42.             System.out.println(e.getMessage());
  43. returntrue;
  44.         } catch (IOException e) {
  45.             e.printStackTrace();
  46.         }
  47. returnfalse;
  48.     }
  49. public List<UserInfo> getAllUsers(){
  50.         AllUserHandler auh=new AllUserHandler();
  51. try {
  52.             saxParser.parse(IN, auh);
  53.         } catch (SAXException e) {
  54.             System.out.println(e.getMessage());
  55.         } catch (IOException e) {
  56.             e.printStackTrace();
  57.         }
  58. return auh.getList();
  59.     }
  60. publicstaticvoid main(String... args){
  61.         UserService us=new UserService();
  62. //System.out.println(us.isExistedUser("002"));
  63. //System.out.println(us.validateLogin("root", "ro"));
  64.         List<UserInfo> list=us.getAllUsers();
  65. for(UserInfo ui : list){
  66.             System.out.println("id: "+ui.getId());
  67.             System.out.println("username: "+ui.getUsername());
  68.             System.out.println("password: "+ui.getPassword());
  69.             System.out.println("---------------------------");
  70.         }
  71.     }
  72. }

好了,先說到這兒了...呵呵