sax解析 一行一行的解析,針對數據量較大的
dom解析 將整個數據加載,針對數據較小的
sax步驟
1、獲得解析工廠 SAXParserFactory
2、工廠獲取解析器 SAXParser
3、加載文檔Document注冊處理器
1、首先寫一個xml
person.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person> <name>至尊寶</name> <age>90000</age> </person> <person> <name>紫霞</name> <age>10000</age> </person> </persons>
2、Persond類(准備)
Persond.java
package xml; /* * sax解析 一行一行的解析,針對數據量較大的 * dom解析 將整個數據加載,針對數據較小的 * * sax步驟 * 1、獲得解析工廠 SAXParserFactory * 2、工廠獲取解析器 SAXParser * 3、加載文檔Document注冊處理器 */ public class Persond { private String name; private int age; public Persond() { } public Persond(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3、注冊處理器(存儲對象)
PersonHandler.java
package xml; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /* * 存儲對象 */ public class PersonHandler extends DefaultHandler { private List<Persond> persons; private Persond person; private String tag; //記錄標簽名 @Override public void startDocument() throws SAXException { // System.out.println("處理文檔開始"); persons=new ArrayList<Persond>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub System.out.println("開始一個元素"+qName); if(null!=qName) { tag=qName; } if(null!=qName&&qName.equals("person")) { person=new Persond(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String str=new String(ch,start,length); if(null!=tag&&tag.equals("name")) { // System.out.println(new String(ch,start,length)); //存數據 person.setName(str); }else if(null!=tag&&tag.equals("age")) { Integer age=Integer.valueOf(str); person.setAge(age); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // System.out.println("結束一個元素"+qName); if(qName.equals("person")) { this.persons.add(person); } tag=null; } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("文檔處理結束"); } public List<Persond> getPersons() { return persons; } public void setPersons(List<Persond> persons) { this.persons = persons; } }
4、正式解析
ParseDemo01.java
package xml; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class ParseDemo01 { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //1、獲取解析工廠 SAXParserFactory是protect類型,所以用他的靜態方法 SAXParserFactory factory=SAXParserFactory.newInstance(); //2、從解析工廠獲取解析器 SAXParser parse=factory.newSAXParser(); //3、加載文檔Document注冊處理器 //4、編寫處理器 PersonHandler handler=new PersonHandler(); parse.parse(Thread.currentThread().getContextClassLoader() .getResourceAsStream("xml/person.xml") , handler); List<Persond> personds=handler.getPersons(); //得到一個List對象,里面包含兩個Persond類型的對象<person1,person2> for(Persond p:personds) { System.out.println(p.getName()+"-->"+p.getAge()); } } }
打印結果