xml—SAX解析

.在使用DOM解析XML文檔時,需要讀取整個XML文檔,在內存中構架代表整個DOM樹的Document對象,

從而再對XML文檔進行操作。此種情況,如果XML文檔特別大,就會消耗計算機的大量內存,並且容易導致內存溢出。

 .SAX解析允許在讀取文檔時,即對文檔進行處理,而不必等到整個文檔裝載完纔會對文檔進行操作。

 .SAX 採用事件處理的方式解析XML文件,涉及兩個部分:解析器和事件處理器

  •   .解析器可以使用JAXP的API創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文檔
  •   .解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會 把當前   解析到的XML文件內容作爲方法的參數傳遞給時間處理器
  • 事件處理器有程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕鬆地得到SAX解析器解析到的數據,從而可以決定如何對數據進行處理
 

舉例:book.xml

<?xml version="1.0" encoding="UTF-8" ?>

<書架>

    <書> 

        <書名 name = "xxxx ">java 就業培訓教程</書名>

        <作者>張孝祥</作者>  

        <售價>109元</售價>

        <售價>39.00元</售價>

    </書>

    <書> 

        <書名 >JavaScript網頁製作</書名>

        <作者>韓順平</作者>  

        <售價>28.00元</售價>

    </書>

</書架>


//1.創建解析工廠

   SAXParserFactory factory = SAXParserFactory .newInstance();

//2.得到解釋器

   SAXParser sp = factory.newSAXParser();

//3.得到讀取器

   XMLReader reader = sp.getXMLReader();

//4.設置內容處理器

reader.setContentHandler(new ListHandler());

//5.讀取xml文檔內容

reader.parser("src/book.xml")

//得到xml文檔中所有內容

class ListHandler implements ContentHandler(

   public void startElement(String url,String localName,String name,Attributes atts)

       throws SAXException(

       System.out.println("<"+name+">")

       //取屬性

      for ( int  i=0; atts != null && i<atts.getLength();i++ )(

         String attName = atts.getQName(i);

         String  attValue = atts.getValue(i);

         System.out.println(attName  + "="+attValue );

    )

      

  )

  public void characters(char[] ch,int start,intlength)

              throws SAXException(   

             System.out.println(new String(ch,start,lengh));

        )

   public void endElement(String url,String localName,String name)

    throws SAXException(

         System.out.println("</"+name+">")

    )

)


// 獲取指定標籤的內容

//1.創建解析工廠

   SAXParserFactory factory = SAXParserFactory .newInstance();

//2.得到解釋器

   SAXParser sp = factory.newSAXParser();

//3.得到讀取器

   XMLReader reader = sp.getXMLReader();

//4.設置內容處理器

reader.setContentHandler(new TagValueHandler ());

//5.讀取xml文檔內容

reader.parser("src/book.xml")


class TagValueHandler extends DefaultHandler(

  private String currentTag;//記住當前解析的是什麼標籤

  private int needNumber =2;//記住想獲取第幾個作者標籤的值

  private int currentNumber;//當前解析到的第幾個作者標籤 

   public void startElement(String url,String localName,String name,Attributes atts)

       throws SAXException(

          currentTag =name;

          if(currentTag .equals("作者"))(

             currentNumber++;

         )

    )

      

  )

  public void characters(char[] ch,int start,intlength)

              throws SAXException(   

                 if ("作者".equals(currentTag) && currentNumber ==needNumber  )(

                     System.out.println(new String(ch,start,length)) 

               )

        )

   public void endElement(String url,String localName,String name)

    throws SAXException(

            currentTag  = null;

    )

)

打印結果:韓順平

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章