xml_SAX解析


(一)SAX解析

  

1.1 SAX解析
SAX:基於事件處理的機制
sax解析xml文件時,遇到根開始標簽,根結束標簽,開始解析文件,文件解析結束,字符內容,空白字符等都會觸發各自的方法。

優點:
適合解析大文件,對內存要求不高
輕量級的解析數據方式,效率更高
缺點:
不能隨機解析(只能從頭開始解析,一點點往后進行)
不能修改XML文件,只能進行查詢

 

1.2用SAX解析遍歷整個xml文件並進行原樣輸出

1.2.1 java代碼

package xml4;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
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 SaxTest {
	public static void main(String[] args) {
		// SAX解析 ①獲取factory工廠
		SAXParserFactory factory = SAXParserFactory.newInstance();

		try {
			// SAX ②獲取解析器
			SAXParser parser = factory.newSAXParser();
			// 獲取handel的對象
			SaxTestHandel sh = new SaxTestHandel();
			try {
				parser.parse(new File("src/xml4/desk.xml"), sh);
			} catch (IOException e) {
				e.printStackTrace();
			}

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}

	}
}

class SaxTestHandel extends DefaultHandler {
	//當開始讀到這個文件時,觸發該相應
	@Override
	public void startDocument() throws SAXException {
		System.out.println("開始解析了!");
	}
	//讀完了,所有的,觸發該方法
	@Override
	public void endDocument() throws SAXException {
		//System.out.println("解析完了!");
	}
	
	//讀到元素標簽時,觸發該方法
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.print("<");
		System.out.print(qName);
		for(int i=0;i<attributes.getLength();i++) {
			String qName2 = attributes.getQName(i);
			String value = attributes.getValue(qName2);
			System.out.print(" "+qName2+"="+"'"+value+"'");
		}
		System.out.print(">");
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.print("</"+qName+">");
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
			String str=new String(ch,start,length);
			System.out.print(str);
	}

}

1.2.2 Xml代碼

<?xml version="1.0" encoding="UTF-8"?>
<disks>
	<disk name='c盤'>
		<size>10G</size>
		<directory>100</directory>
		<file>200</file>
	</disk>

	<disk name='d盤'>
		<size>20G</size>
		<directory>200</directory>
		<file>3000</file>
	</disk>
</disks>

 1.3  小練習 題目:獲取一個xml 文件中的信息,並把它封裝到一個實體類中去,並存放到一個集合中去,並保存到本地文件中去 

 1 package xml4;
 2 
 3 public class Disk {
 4     
 5     private String name;
 6     private String size;
 7     private String directory;
 8     private int  file;
 9     public Disk(String name, String size, String directory, int file) {
10         super();
11         this.name = name;
12         this.size = size;
13         this.directory = directory;
14         this.file = file;
15     }
16     public Disk() {
17         super();
18     }
19     public String getName() {
20         return name;
21     }
22     public void setName(String name) {
23         this.name = name;
24     }
25     public String getSize() {
26         return size;
27     }
28     public void setSize(String size) {
29         this.size = size;
30     }
31     public String getDirectory() {
32         return directory;
33     }
34     public void setDirectory(String directory) {
35         this.directory = directory;
36     }
37     public int getFile() {
38         return file;
39     }
40     public void setFile(int file) {
41         this.file = file;
42     }
43     @Override
44     public String toString() {
45         return "Disk [name=" + name + ", size=" + size + ", directory=" + directory + ", file=" + file + "]";
46     }
47     
48 }

 

package xml4;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
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;

import sun.awt.FwDispatcher;

public class SaxTest2 {
	public static void main(String[] args) {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			File f = new File("src/xml4/desk.xml");
			SaxTest2Hander dh = new SaxTest2Hander();
			SAXParser parser = factory.newSAXParser();
			
			try {
				parser.parse(f, dh);
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}
}

class SaxTest2Hander extends DefaultHandler {
	private ArrayList<Disk> list;
	private Disk disk;
	private String tagName;
	

	@Override
	public void startDocument() throws SAXException {
		list=new ArrayList<Disk>();
	}

	@Override
	public void endDocument() throws SAXException {
		
		try {
			PrintWriter fw=new PrintWriter("src/xml4/desk.txt");
			for (Disk disk : list) {
				fw.println(disk);
				fw.flush();
			}
			fw.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
			if("disk".equals(qName)) {
				disk=new Disk();
			}else {
				tagName=qName;
			}
			for(int i=0;i<attributes.getLength();i++) {
					String qName2 = attributes.getQName(0);
					String value = attributes.getValue(qName2);
					if(qName2.equals("name")){
						disk.setName(value);
					}					
			}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
			if("disk".equals(qName)) {
				list.add(disk);
			}else {
				tagName=null;
			}
		
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		String str=new String(ch,start,length);
		if("size".equals(tagName)) {
			disk.setSize(str);
		}
		if("directory".equals(tagName)) {
			disk.setDirectory(str);
		}
		if("file".equals(tagName)) {
			disk.setFile(Integer.parseInt(str));
		}
	}

}

  

<?xml version="1.0" encoding="UTF-8"?>
<disks>
	<disk name='c盤'>
		<size>10G</size>
		<directory>100</directory>
		<file>200</file>
	</disk>

	<disk name='d盤'>
		<size>20G</size>
		<directory>200</directory>
		<file>3000</file>
	</disk>
</disks>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM