XML JAVA解析 -- SAX
SAX : Simple API for XML
1.原理:
事件处理机制,对文档进行顺序扫描,当扫描到文档的开始、结束,元素的开始、结束等处时触发事件,
调用相应的事件处理函数进行处理。
2.Class Digaram
?
ContentHandler: 文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。
characters(...) 在">"和"<"之间被调用;
有Entity(< >...XML规范Entity和<!ENTITY...>等自定义Entity)的将调用1+2*num(Entity)次该方法。
如:Mark < Tuwen ---> (1) Mark (2) < (3) Tuwen
DTDHandler:DTD事件的注释和未解析的实体声明部分。SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;
但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement()事件之前报告所有的DTD事件。
EntityResolver:在打开任何外部实体前调用此方法。
在加载外部资源(DTD/Schema)时调用,反悔null则无影响,否则将覆盖要加载的资源。
ErrorHandler: SAX错误处理程序的基本接口。
?
3.例子
从Class Diagram,SAX共有两种方式对XML文件进行解析。
workers.dtd
?
<!ELEMENT workers (worker*)>
<!ELEMENT worker (name)>
<!-- ID 之后一定要加 #REQUIRED -->
<!ATTLIST worker id ID #REQUIRED>
<!ATTLIST worker fresh CDATA "false">
<!ELEMENT name (#PCDATA)>
?
workers.xml
?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workers SYSTEM "workers.dtd">
<workers>
?<worker id="W001">
??<name>Mark < Tuwen</name>
?</worker>
?<worker id="W002" fresh="true">
??<name>Hello Kitty</name>
?</worker>
</workers>
?
WorkersHandler.java
?
package com.siyuan.xml;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class WorkersHandler extends DefaultHandler {
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
? */
?@Override
?public void characters(char[] ch, int start, int length) throws SAXException {
??System.out.println("In characters-----------------");
??System.out.println(new String(ch, start, length));
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#endDocument()
? */
?@Override
?public void endDocument() throws SAXException {
??System.out.println("End Document-----------------");
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
? */
?@Override
?public void endElement(String uri, String localName, String qName) throws SAXException {
??System.out.println("End Element-----------------");
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
? */
?@Override
?public void error(SAXParseException e) throws SAXException {
??System.out.println("error--------------------");
??System.out.println(e);
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
? */
?@Override
?public void fatalError(SAXParseException e) throws SAXException {
??System.out.println("fatal----------------------");
??System.out.println(e);
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
? */
?@Override
?public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException {
??System.out.println("Resolve Entity-----------------");
??System.out.println("PublicId : " + publicId);
??System.out.println("SystemId : " + systemId);
??return null;
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#startDocument()
? */
?@Override
?public void startDocument() throws SAXException {
??System.out.println("Start Document-----------------");
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
? */
?@Override
?public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
??System.out.println("Start Element-----------------");
??System.out.println("uri : " + uri);
??System.out.println("localName : " + localName);
??System.out.println("qName : " + qName);
??if ("worker".equals(qName)) {
???System.out.println("Attribute[id] : " + attributes.getValue("id"));
???System.out.println("Attribute[fresh] : " + attributes.getValue("fresh"));
??}
?}
?/* (non-Javadoc)
? * @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
? */
?@Override
?public void warning(SAXParseException e) throws SAXException {
??System.out.println("Warning--------------------");
??System.out.println(e);
?}
}
?
SAXParserTest.java
?
package com.siyuan.xml;
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.SAXException;
public class SAXParserTest {
?/**
? * @param args
? * @throws SAXException
? * @throws ParserConfigurationException
? * @throws IOException
? */
?public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
??// TODO Auto-generated method stubd
??SAXParserFactory factory = SAXParserFactory.newInstance();
??factory.setValidating(true);
??SAXParser parser = factory.newSAXParser();
??parser.parse(new File("src/com/siyuan/xml/workers.xml"), new WorkersHandler());
?}
}
?
XMLReaderTest.java
?
package com.siyuan.xml;
import java.io.IOException;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class XMLReaderTest {
?/**
? * @param args
? * @throws SAXException
? * @throws IOException
? */
?public static void main(String[] args) throws SAXException, IOException {
??// TODO Auto-generated method stub
??XMLReader reader = XMLReaderFactory.createXMLReader();
??DefaultHandler handler = new WorkersHandler();
??reader.setContentHandler(handler);
??reader.setEntityResolver(handler);
??reader.setErrorHandler(handler);
??reader.parse("src/com/siyuan/xml/workers.xml");
?}
}?
?
?