(一)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>
