xml解析 SAX

 SAX解析:

     Simple Api for XML。

     SAX在解析文檔時使用的是邊讀取邊解析的方式,而不是一次性的將文檔全部裝入內存中。

    所以它的讀取速度很快,佔用很少的內存

    僅向前,不能任意的讀取一個節點。

    也不能修改XML文件。

SAX讀取一個XML文檔的過程:

 


解析器:

   1: SAXParserFactory
    定義工廠 API,使應用程序能夠配置和獲取基於 SAX 的解析器以解析 XML 文檔。
  :2: SAXParser – 是SAX解析器。 定義包裝 XMLReader 實現類的 API 。此類的實例可以從 SAXParserFactory.newSAXParser() 方法獲得。
   3: XMLReader-用於讀取XML數據。
     通過SAXParser. getXMLReader()獲得。
   4:parse(String fileName)用於讀取一個XML文檔。

實例:


注意:1:文本的讀取需要需要屏蔽掉 空白符實現類的成員變量來記錄狀態判斷

           如:上圖print    idx

        :2: 對uri qname  localname的理解,函數參數的使用要明白其值是什麼

本例對xml的一個解析過濾:

public void readXML(){
	
		XMLReader r=null;
		try {
			r = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		
		r.setContentHandler(new DefaultHandler(){
			
			private String qName;
			private boolean simpleType=false;
            
			@Override
			public void startElement(String uri, String localName,
					String qName, Attributes attributes) throws SAXException {

				if(qName.equals("user")){
					String name=attributes.getValue("name");
					String pwd=attributes.getValue("pwd");
					System.out.println("user:"+name+","+pwd);
				}else if(qName.equals("contact")){
					String id=attributes.getValue("id");
					System.out.print("   |---contact:"+id+",");
					simpleType=true;
				}else{
					if(simpleType){
						this.qName=qName;
					}
				}
			}

			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				if(qName.equals("user")){
					System.out.println("/user");
				}else if(qName.equals("contact")){
					System.out.println();
					System.out.println("   /contact");
					simpleType=false;
				}
				this.qName=null;
			}

			@Override
			public void characters(char[] ch, int start, int length)
					throws SAXException {
				if(this.qName!=null){
					System.out.print(new String(ch,start,length)+",");
				}
			}
			
		});
		
		try {
			r.parse("./XML/Two.xml");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
		
	}
解釋的xml文檔

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

<contacts xmlns="http://www.example.org/Two2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Two2 Two2.xsd">  
  <user name="jack" pwd="309fee4e541e51de2e41f21bebb342aa"> 
    <contact id="bfee73a0c39fd13e3f6c5b65eae93a24"> 
      <name>張三</name>  
      <sex>男</sex>  
      <age>24</age>  
      <address>湖南益陽</address>  
      <tel>15576256943</tel> 
    </contact>  
    <contact id="c1517f3393e3ff2a3419dba754fbdc13"> 
      <name>李四</name>  
      <sex>男</sex>  
      <age>25</age>  
      <address>湖南長沙</address>  
      <tel>15576259835</tel> 
    </contact>  
    <contact id="ce646fc8ccb569ab3359b848feb71c00">
      <name>Rose</name>
      <sex>女</sex>
      <age>22</age>
      <address>湖南常德</address>
      <tel>15543269865</tel>
    </contact>
  </user> 
</contacts>
結果:

user:jack,309fee4e541e51de2e41f21bebb342aa
   |---contact:bfee73a0c39fd13e3f6c5b65eae93a24,張三,男,24,湖南益陽,15576256943,
   /contact
   |---contact:c1517f3393e3ff2a3419dba754fbdc13,李四,男,25,湖南長沙,15576259835,
   /contact
   |---contact:ce646fc8ccb569ab3359b848feb71c00,Rose,女,22,湖南常德,15543269865,
   /contact
/user

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