Java基礎之XML解析

由於最近要練習手寫WebServer服務器,裏面須要用到XML解析,服務器

發現之前沒有編寫過解析XML解析的博文,今天就補一下。ide

XML解析方式

  • DOM解析
  • SAX解析
  • JDOM解析
  • DOM4J解析

今天這種方式只寫出SAX解析的方式:spa

    優勢:code

      解析速度快,xml

      佔用內存少,對象

    缺點:blog

      只能讀取XML,繼承

      不能修改XML,內存

      不能知道當前解析的節點。文檔

我在這使用SAX解析總結了幾個步驟:

  1. 建立一個SAX解析工廠對象
  2. 經過工廠對象獲取一個XML解析器
  3. 咱們能夠經過解析器的parse方法來進行xml解析

      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,剛剛忘記寫了

相關文章
相關標籤/搜索