由於最近要練習手寫WebServer服務器,裏面須要用到XML解析,服務器
發現之前沒有編寫過解析XML解析的博文,今天就補一下。ide
今天這種方式只寫出SAX解析的方式:spa
優勢:code
解析速度快,xml
佔用內存少,對象
缺點:blog
只能讀取XML,繼承
不能修改XML,內存
不能知道當前解析的節點。文檔
我在這使用SAX解析總結了幾個步驟:
parse(InputStream is, HandlerBase hb)
參數一:這裏是一個字節輸入流,咱們這裏能夠經過類加載器的getResourceAsStream方法來進行指定xml的文件
參數二:要使用的SAX HandlerBase,這個定義的Handle須要繼承DefaultHandler,經過重寫這個類的方法來進行解析節點
1 //獲取一個SAX解析工廠 2 SAXParserFactory factory = SAXParserFactory.newInstance(); 3 //獲取解析器 4 SAXParser parser = factory.newSAXParser(); 5 //建立Handler的解析類 6 PHandler pHandler = new PHandler(); 7 //經過parse方法來指定解析的文件和解析類 8 parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("net/cncandy/parsexml/p.xml"), pHandler);
這裏的getResourceAsStream的參數時,若是這個文件放在了包裏面,這裏所填寫的參數應該是將包名中的點換成/就能夠了,記得加上xml文件名
上面所說的PHandler是咱們直接寫的一個類,這個類是繼承的DefaultHandler類,咱們須要實現裏面的幾個方法,咱們先來介紹下咱們須要的方法。
startDocument | 接收文件開頭的通知,默認狀況下,什麼也不作。 應用程序編寫者能夠在子類中覆蓋此方法,以在文檔的開頭執行特定操做 |
startElement | 接收元素開始的通知,默認狀況下,什麼也不作。 應用程序編寫者能夠在子類中覆蓋此方法,以在每一個元素的開始處採起特定的操做 |
characters | 接收元素內的字符數據通知。 能夠經過new String的方式將ch轉換成字符串輸出 |
endElement | 接收元素結尾的通知。 默認狀況下,什麼也不作。 應用程序編寫者能夠在子類中覆蓋此方法,以在每一個元素的末尾執行特定操做(例如,完成樹節點或將輸出寫入文件)。 |
endDocument | 接收文件結尾的通知。 默認狀況下,什麼也不作。 應用程序編寫者能夠在子類中覆蓋此方法,以在文檔的末尾執行特定操做 |
1 class PHandler extends DefaultHandler{ 2 //開始解析文檔 3 @Override 4 public void startDocument() throws SAXException { 5 System.out.println("開始解析文檔"); 6 } 7 8 //開始解析元素 9 @Override 10 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 11 12 } 13 14 @Override 15 public void characters(char[] ch, int start, int length) throws SAXException { 16 String string = new String(ch,start,length).trim(); 17 if(string.length()>0) { 18 System.out.println(string); 19 } 20 21 } 22 23 //結束解析元素 24 @Override 25 public void endElement(String uri, String localName, String qName) throws SAXException { 26 27 } 28 29 //結束解析文檔 30 @Override 31 public void endDocument() throws SAXException { 32 System.out.println("結束解析文檔"); 33 } 34 }
XML節點表,George是characters,剛剛忘記寫了