對xml檔案的sax解析(增刪改查)
阿新 • • 發佈:2018-11-17
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檔案進行遍歷解析。