1.解析的步骤
(1) 创建SAX解析工厂的实例。
SAXParserFactory spf = SAXParserFactory.newInstance();
(2) 创建一个SAX解析器。
SAXParser sp = spf.newSAXParser();
(3) 得到SAX的处理器(处理器由用户自己编写实现)。
SAXHandler handler = new SAXHandler();
(4) 使用用户创建的处理器,解析器解析文件。
sp.parse(new InputSource(reader), handler);
2 相关类
在J2sdk1.4中的SAX版本为2.0,它提供DefaultHandler(org.xml.sax.helpers.DefaultHandler)接口,通过这个接口实现自己的解析器。接口中需要实现的解析函数为:
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
读取XML数据的节点元素开始时触发,需要实现这个方法进行标记元素的名字的操作。
public void endElement(String uri, String localName, String qName) throws SAXException
处理节点元素终止时触发,可以添加代码来将节点数据进行存储。
public void characters(char[] ch, int start, intlength) throws SAXException
处理节点之间的数据,可以添加代码来读取节点间的数据值。
3 实例
(1)person.xml
<?xml version="1.0" encoding="UTF-8"?> <person> <name>A</name> <college>B</college> <telephone>C</telephone> <address>D</address> </person>
(2)SaxProcessor.java
import java.io.*; import java.util.Hashtable; import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.helpers.*; public class SaxProcessor { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { File file = new File("src/person.xml"); FileReader reader = new FileReader(file); // 创建解析工厂实例 SAXParserFactory spf = SAXParserFactory.newInstance(); // 创建解析器 SAXParser sp = spf.newSAXParser(); // 创建处理类实例 SAXHandler handler = new SaxProcessor().new SAXHandler(); // 解析 sp.parse(new InputSource(reader), handler); Hashtable hashTable = handler.getTable(); // 输出数据 System.out.println("personal information"); System.out.println("name:" + (String) hashTable.get(new String("name"))); System.out.println("college:" + (String) hashTable.get(new String("college"))); System.out.println("phone:" + (String) hashTable.get(new String("telephone"))); System.out.println("address" + (String) hashTable.get(new String("address"))); } catch (Exception e) { System.out.println(e.getMessage()); } } // 自定义处理类(内部类) class SAXHandler extends DefaultHandler { private Hashtable table = new Hashtable(); private String currentElement = null; private String currentValue = null; public Hashtable getTable() { return table; } // 覆盖startElement方法,取出节点标签 public void startElement(String uri, String localName, String qName, Attributes attributes) { currentElement = qName; } // 覆盖characters方法,取出节点值 public void characters(char[] ch, int start, int length) throws SAXException { currentValue = new String(ch, start, length); } // 覆盖endElement方法,放入Hashtable public void endElement(String uri, String localName, String qName) throws SAXException { if (currentElement.equals(qName)) table.put(currentElement, currentValue); } }; }
(3)输出结果:
personal information name:A college:B phone:C addressD