sax解析例子演示

codingcoge發表於2018-06-05

例項1:使用sax解析讀取xml檔案,完整輸出文件內容

主程式入口:

public static void main(String[] args)throws Exception {
        //1.建立SAXParser
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        //2.讀取xml檔案
        MyDefaultHandler2 handler = new MyDefaultHandler2();
        parser.parse(new File("./src/contact.xml"), handler);
        String content = handler.getContent();
        System.out.println(content);
    }

自定義類重寫DefaultHandler方法

public class MyDefaultHandler2 extends DefaultHandler {
    //儲存xml文件資訊
    private StringBuffer sb = new StringBuffer();
    
    //獲取xml資訊
    public String getContent(){
        return sb.toString();
    }
    

    /**
     * 開始標籤
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        sb.append("<"+qName);
        //判斷是否有屬性
        if(attributes!=null){
            for(int i=0;i<attributes.getLength();i++){
                //得到屬性名稱
                String attrName = attributes.getName(i);
                //得到屬性值
                String attrValue = attributes.getValue(i);
                sb.append(" "+attrName+"=""+attrValue+""");
            }
        }
        sb.append(">");
    }
    
    /**
     * 文字內容
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //得到當前讀取的文字
        String content = new String(ch,start,length);
        sb.append(content);
    }
    
    /**
     * 結束標籤
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        sb.append("</"+qName+">");
    }
}

例項2:使用sax解析把 xml文件封裝成物件:

主程式入口:

public static void main(String[] args)throws Exception {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        MyDefaultHandler3 handler = new MyDefaultHandler3();
        parser.parse(new File(".\src\contact.xml"), handler);
        List<Contact> list = handler.getList();
        for (Contact contact : list) {
            System.out.println(contact);
        }
    }

自定義類重寫DefaultHandler方法

public class MyDefaultHandler3 extends DefaultHandler {
    //儲存所有聯絡人物件
    private List<Contact> list = new ArrayList<Contact>();
    
    public List<Contact> getList(){
        return list;
    }
    //儲存一個聯絡人資訊
    private Contact contact;
    /**
     * 思路: 
     *     1)建立Contact物件
     *  2)把每個contact標籤內容存入到Contact物件
     *  3)把Contact物件放入List中
     */
    //用於臨時儲存當前讀到的標籤名
    private String curTag;

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        curTag = qName;
        //讀取到contact的開始標籤建立Contact物件
        if("contact".equals(qName)){
            contact = new Contact();
            
            //設定id值
            contact.setId(attributes.getValue("id"));
        }
    }
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //當前文字內容
        String content = new String(ch,start,length);
        
        if("name".equals(curTag)){
            contact.setName(content);
        }
        
        if("age".equals(curTag)){
            contact.setAge(content);
        }
        
        if("phone".equals(curTag)){
            contact.setPhone(content);
        }
        
        if("email".equals(curTag)){
            contact.setEmail(content);
        }
        
        if("qq".equals(curTag)){
            contact.setQq(content);
        }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //設定空時為了避免空格換行設定到物件的屬性中
        curTag = null;
        //讀到contact的結束標籤放入List中
        if("contact".equals(qName)){
            list.add(contact);
        }
    }
}

注意:為什麼endElement要設定curTag = null?

因為 characters方法是遇到text文字就執行 ,如果遇到<contact>和<name>
之間的空格和換行 也會執行 ,而這時 curTag 還是原來的標籤名字,這樣子就會覆蓋到物件的屬性中,導致出現 空格換行覆蓋原來屬性。


相關文章