簡介:
事件驅動,邊讀邊解析
NO. |
SAXParser |
作用 |
SAXParserFactory |
作用 |
1 |
public abstract class SAXParser extends Object |
繼承關系 |
public abstract class SAXParserFactory extends Object |
繼承關系 |
2 |
public void parse(File f,DefaultHandler dh) throws SAXException,IOException |
解析使用指定的指定XML文件的內容
當傳入事件處理器,相當於在方法里面綁定了一個事件(自動執行事件) |
public static SAXParserFactory newInstance() |
創建 SAXParserFactory實例 |
3 |
public abstract SAXParser newSAXParser()throws ParserConfigurationException,SAXException |
創建SAXParse實例 |
NO |
DefaultHandler (事件處理器) |
參數 |
作用 |
1 |
public class DefaultHandler extends Object implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler |
繼承這個類然后重寫下面三個方法 | |
2 |
public void characters(char[] ch,int start,int length)throws SAXException |
|
接收元素內的字符數據通知。 默認情況下,什么也不做。 應用程序編寫者可以覆蓋此方法以對每個字符數據塊采取特定操作(例如將數據添加到節點或緩沖區,或將其打印到文件中)。 |
3 |
public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException |
|
接收元素開始的通知。 默認情況下,什么也不做。 應用程序編寫者可以在子類中覆蓋此方法,以在每個元素的開始處采取特定的操作(例如分配新的樹節點或將輸出寫入文件)。 |
4 |
public void endElement(String uri,String localName,String qName)throws SAXException |
uri - 名稱空間URI,或空字符串,如果該元素沒有命名空間URI或未命名空間處理。
|
接收元素結尾的通知。 |
代碼實現:
package SAX.cn; import java.io.File; 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 TestSax { public static void main(String[] args) throws Exception { /** * 1、創建一個解析器工廠 * 2、創建解析器 * 3、執行parse()方法 */ // 創建解析器工廠 SAXParserFactory spf = SAXParserFactory.newInstance(); // 創建解析器 SAXParser sax = spf.newSAXParser(); // 執行parse()方法 sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml",new MyDef()); // 執行parse()方法后會自動執行事件處理器中的方法 } } class MyDef extends DefaultHandler{ /** * 開始標簽 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<" + qName + ">"); } /** * 文本內容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } /** * 結束標簽 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</" + qName + ">"); } }
輸出結果:
import java.io.File; 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 TestSax { public static void main(String[] args) throws Exception { /** * 1、創建一個解析器工廠 2、創建解析器 3、執行parse()方法 */
// 創建解析器工廠
SAXParserFactory spf = SAXParserFactory.newInstance(); // 創建解析器
SAXParser sax = spf.newSAXParser(); // 執行parse()方法
sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml", new MyDef2()); // 執行parse()方法后會自動執行事件處理器中的方法
} } // 獲取所有name標簽的值
class MyDef2 extends DefaultHandler { boolean flag = false; // 相當於是倉庫鑰匙,startElement()是進門和endElement()就是出門,flag=true就是用鑰匙開門,flag=false就是關門,characters()就是在進出倉庫拿內容
@Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 判斷qName是否是name標簽
if ("name".equals(qName)) { flag = true; // 找到name標簽則flag為true
} } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag == true) { // flag為true表示已經找到name標簽
System.out.println("name:" + new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(flag == true) { // 已經找到name的開始標簽並打印了內容,那么此次那么標簽應該結束
flag = false; } } } }
上面的代碼實現了獲取name標簽的值(使用"name".equals(qName)來控制):
package SAX.cn; import java.io.File; 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 TestSax { public static void main(String[] args) throws Exception { /** * 1、創建一個解析器工廠 2、創建解析器 3、執行parse()方法 */
// 創建解析器工廠
SAXParserFactory spf = SAXParserFactory.newInstance(); // 創建解析器
SAXParser sax = spf.newSAXParser(); // 執行parse()方法
sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml", new MyDef2()); // 執行parse()方法后會自動執行事件處理器中的方法
} } // 獲取所有name標簽的值
class MyDef2 extends DefaultHandler { boolean flag = false; // 相當於是倉庫鑰匙,startElement()是進門和endElement()就是出門,flag=true就是用鑰匙開門,flag=false就是關門,characters()就是在進出倉庫拿內容
int index = 1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 判斷qName是否是name標簽
if ("name".equals(qName) && index==1) { flag = true; // 找到name標簽則flag為true
} } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag == true) { // flag為true表示已經找到name標簽
System.out.println("name:" + new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(flag == true) { // 已經找到name的開始標簽並打印了內容,那么此次那么標簽應該結束
flag = false; index++; } } }
上面的代碼實現了獲取第一個name標簽的值(使用index來控制):