1. 程式人生 > >Java——SAX解析XML檔案

Java——SAX解析XML檔案

SAX適用於只讀取XML檔案內容的情況,因為SAX是一種邊讀邊解析的模式,所以不需要直接將XML檔案直接塞入記憶體,讀取速度也更快,但是隻能讀。
SAX解析主要有兩個部分:①解析器②事件處理器
過程:

// 建立解析器工廠、獲取解析器
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        // 建立xml讀取器,繫結事件處理器
        XMLReader reader = parser.getXMLReader
(); GetStuInfoHandler stuHandler = new GetStuInfoHandler(); reader.setContentHandler(stuHandler); reader.parse("src/com/keixn/day3/stu_info.xml");

而讀取器繫結的事件處理器需要繼承ContentHandler介面或者繼承他的子類(常用),然後重寫需要的方法。這個事件處理器當讀取器讀取xml檔案內容時便會觸發相應的方法。
下面使用SAX解析XML檔案,並將獲取的內容封裝成JavaBean便於資料處理:

package
com.keixn.day3; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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.XMLReader; import org.xml.sax.helpers.DefaultHandler; /** * 使用SAX解析XML檔案並封裝到JavaBean物件中 * * @author KeXin * */ public class Demo { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { // 建立解析器工廠、獲取解析器 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); // 建立xml讀取器,繫結事件處理器 XMLReader reader = parser.getXMLReader(); GetStuInfoHandler stuHandler = new GetStuInfoHandler(); reader.setContentHandler(stuHandler); reader.parse("src/com/keixn/day3/stu_info.xml"); List<Student> stu_list = stuHandler.GetStuList(); for(Student stu:stu_list){ System.out.println(stu.GetStu(stu)); } } } class GetStuInfoHandler extends DefaultHandler { private final String STU = "stu", EXAM = "exam", EXAMID = "examid", IDCARD = "idcard", NAME = "name", LOCATION = "location", GRADE = "grade"; Student stu; private static String flag; private List<Student> stu_list = new ArrayList<>(); public List GetStuList() { return stu_list; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 每次解析到一個標籤都會觸發該方法 if (qName.equals(STU)) { stu = new Student(); // 獲取stu標籤內的屬性值 if (attributes != null) { stu.setExamid(attributes.getValue(EXAMID)); stu.setIdcard(attributes.getValue(IDCARD)); } } else if (qName.equals(NAME)) { flag = NAME; } else if (qName.equals(LOCATION)) { flag = LOCATION; } else if (qName.equals(GRADE)) { flag = GRADE; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag==null) return; switch (flag) { case NAME: stu.setName(new String(ch, start, length)); break; case LOCATION: stu.setLocation(new String(ch, start, length)); break; case GRADE: stu.setGrade(new String(ch, start, length)); break; default: break; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals(STU)){ stu_list.add(stu); } flag = null; } }

相應的stu_info.xml:

<?xml version="1.0" encoding="UTF-8"?>
<exam>
    <stu examid="000" idcard="122">
        <name>lisa</name>
        <location>北京</location>
        <grade>78</grade>
    </stu>
</exam>