1. 程式人生 > >對xml檔案的sax解析(增刪改查)

對xml檔案的sax解析(增刪改查)

 

crud(增刪改查):

c:creat

r:retrieve

u:update

d:delete

以下筆記來自於韓順平老師的講解。

現在是用java來操作。

第一步:新建java工程。file-new-Java Project,輸入工程的名字,點選finish.

第二步:放一個待解析的xml檔案(classes.xml)到工程專案中的src目錄中。

classes.xml檔案的內容是:

<?xml version="1.0" encoding="UTF-8"?>
<班級>
  <學生>
    <名字>
周星馳</名字> <年齡>23</年齡> <介紹>學習刻苦</介紹> </學生> <學生> <名字>林青霞</名字> <年齡>32</年齡> <介紹>是一個好學生</介紹> </學生> </班級>

第三步:寫一個java程式去解析這個xml檔案。對著src右鍵,new-package,輸入包名com.saxparsetest,點選finishl。

第四步:對著com.saxparsetest右鍵,寫一個測試java測試程式,new-class:

第五步:可以愉快的開始寫程式碼了。

package com.saxparsetest;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class saxparse {

    public static void main(String[] args) throws Exception, SAXException {
        // TODO Auto-generated method stub
        //使用sax技術解析xml檔案(有套路)。
        //第一步,建立SaxParserFactory:
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //第二步,建立SaxParser解析器:
        SAXParser saxParser=spf.newSAXParser();
        //第三步,把xml檔案和【事件處理物件】關聯
        saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二個引數用於關聯下面定義的事件處理類
        
    }

}
//定義事件處理類
class myDefaultHandle_wodelei extends DefaultHandler{

    @Override//該函式發現文件開始:
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件開始的函式:startDocument()");
        super.startDocument();
    }

    @Override//該函式順序發現xml檔案中的元素(【推的機制】):
    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("元素名稱:"+arg2);
        super.startElement(arg0, arg1, arg2, arg3);
    }

    @Override//該函式發現xml檔案中的文字:
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
    }

    @Override//該函式發現xml檔案中一個元素的結束(即發現這樣的標籤:
</xx>): public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); } @Override//該函式發現整個xml檔案的結束: public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("發現文件結束的函式:endDocument()"); super.endDocument(); } } /* 執行結果: 發現文件開始的函式:startDocument() 元素名稱:班級 元素名稱:學生 元素名稱:名字 元素名稱:年齡 元素名稱:介紹 元素名稱:學生 元素名稱:名字 元素名稱:年齡 元素名稱:介紹 發現文件結束的函式:endDocument() */

 

package com.saxparsetest;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class saxparse {

    public static void main(String[] args) throws Exception, SAXException {
        // TODO Auto-generated method stub
        //使用sax技術解析xml檔案(有套路)。
        //第一步,建立SaxParserFactory:
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //第二步,建立SaxParser解析器:
        SAXParser saxParser=spf.newSAXParser();
        //第三步,把xml檔案和【事件處理物件】關聯
        saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二個引數用於關聯下面定義的事件處理類
        
    }

}
//定義事件處理類
class myDefaultHandle_wodelei extends DefaultHandler{

    @Override//該函式發現文件開始:
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件開始的函式:startDocument()");
        super.startDocument();
    }

    @Override//該函式順序發現xml檔案中的元素(【推的機制】):
    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("元素名稱:"+arg2);
        //super.startElement(arg0, arg1, arg2, arg3);//這句系統給的可以不要了
    }

    @Override//該函式發現xml檔案中的文字:
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        //引數解釋:ch其實是文件本身
        //顯示文字內容:
        System.out.println(new String(ch,start,length));
        //super.characters(ch, start, length);//這句系統給的可以不要了
    }

    @Override//該函式發現xml檔案中一個元素的結束(即發現這樣的標籤:</xx>):
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
    }
    
    @Override//該函式發現整個xml檔案的結束:
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件結束的函式:endDocument()");
        super.endDocument();
    }

}

/*
 發現文件開始的函式:startDocument()
元素名稱:班級

  
元素名稱:學生

    
元素名稱:名字
周星馳

    
元素名稱:年齡
23

    
元素名稱:介紹
學習刻苦

  

  
元素名稱:學生

    
元素名稱:名字
林青霞

    
元素名稱:年齡
32

    
元素名稱:介紹
是一個好學生

  


發現文件結束的函式:endDocument()
 */

以上程式列印很多空行的原因是:xml檔案中每個元素或屬性值後面有空行。

解決辦法1,手工去掉空行,左右內容全部換到一行字,沒有空行就不會列印空格了:

解決辦法2,在程式中加入判斷:

package com.saxparsetest;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class saxparse {

    public static void main(String[] args) throws Exception, SAXException {
        // TODO Auto-generated method stub
        //使用sax技術解析xml檔案(有套路)。
        //第一步,建立SaxParserFactory:
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //第二步,建立SaxParser解析器:
        SAXParser saxParser=spf.newSAXParser();
        //第三步,把xml檔案和【事件處理物件】關聯
        saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二個引數用於關聯下面定義的事件處理類
        
    }

}
//定義事件處理類
class myDefaultHandle_wodelei extends DefaultHandler{

    @Override//該函式發現文件開始:
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件開始的函式:startDocument()");
        super.startDocument();
    }

    @Override//該函式順序發現xml檔案中的元素(【推的機制】):
    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("元素名稱:"+arg2);
        //super.startElement(arg0, arg1, arg2, arg3);//這句系統給的可以不要了
    }

    @Override//該函式發現xml檔案中的文字:
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        String con=new String(ch,start,length);//這是接收到的文字內容
        if(!con.trim().equals("")) //trim()的目的是消除文字兩端的空行
        {
            //引數解釋:ch其實是文件本身
            //顯示文字內容:
            System.out.println(new String(ch,start,length));
            //super.characters(ch, start, length);//這句系統給的可以不要了
        }
    }
    @Override//該函式發現xml檔案中一個元素的結束(即發現這樣的標籤:</xx>):
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
    }
    
    @Override//該函式發現整個xml檔案的結束:
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件結束的函式:endDocument()");
        super.endDocument();
    }

}

/*
 執行結果:
 發現文件開始的函式:startDocument()
元素名稱:班級
元素名稱:學生
元素名稱:名字
周星馳
元素名稱:年齡
23
元素名稱:介紹
學習刻苦
元素名稱:學生
元素名稱:名字
林青霞
元素名稱:年齡
32
元素名稱:介紹
是一個好學生
發現文件結束的函式:endDocument()
 */

或者:

package com.saxparsetest;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class saxparse {

    public static void main(String[] args) throws Exception, SAXException {
        // TODO Auto-generated method stub
        //使用sax技術解析xml檔案(有套路)。
        //第一步,建立SaxParserFactory:
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //第二步,建立SaxParser解析器:
        SAXParser saxParser=spf.newSAXParser();
        //第三步,把xml檔案和【事件處理物件】關聯
        saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二個引數用於關聯下面定義的事件處理類
        
    }

}
//定義事件處理類
class myDefaultHandle_wodelei extends DefaultHandler{

    @Override//該函式發現文件開始:
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件開始的函式:startDocument()");
        super.startDocument();
    }

    @Override//該函式順序發現xml檔案中的元素(【推的機制】):
    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("元素名稱="+arg2);
        //super.startElement(arg0, arg1, arg2, arg3);//這句系統給的可以不要了
    }

    @Override//該函式發現xml檔案中的文字:
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        String con=new String(ch,start,length);//這是接收到的文字內容
        if(!con.trim().equals("")) //trim()的目的是消除文字兩端的空行
        {
            //引數解釋:ch其實是文件本身
            //顯示文字內容:
            System.out.println(new String(ch,start,length));
            //super.characters(ch, start, length);//這句系統給的可以不要了
        }
    }
    @Override//該函式發現xml檔案中一個元素的結束(即發現這樣的標籤:</xx>):
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
    }
    
    @Override//該函式發現整個xml檔案的結束:
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("發現文件結束的函式:endDocument()");
        super.endDocument();
    }

}

/*
 執行結果:
 發現文件開始的函式:startDocument()
元素名稱=班級
元素名稱=學生
元素名稱=名字
周星馳
元素名稱=年齡
23
元素名稱=介紹
學習刻苦
元素名稱=學生
元素名稱=名字
林青霞
元素名稱=年齡
32
元素名稱=介紹
是一個好學生
發現文件結束的函式:endDocument()
 */

 


 小結:sax技術的一個缺陷是不能對xml檔案進行增、刪、改,它主要用來對xml檔案進行遍歷解析。