首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

XML JAVA解析 - SAX

2012-10-28 
XML JAVA解析 -- SAXSAX : Simple API for XML1.原理:事件处理机制,对文档进行顺序扫描,当扫描到文档的开

XML JAVA解析 -- SAX

SAX : Simple API for XML

1.原理:

事件处理机制,对文档进行顺序扫描,当扫描到文档的开始、结束,元素的开始、结束等处时触发事件,

调用相应的事件处理函数进行处理。

2.Class Digaram

?

XML JAVA解析 - SAX

ContentHandler: 文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。

characters(...) 在">"和"<"之间被调用;

有Entity(&lt; &gt;...XML规范Entity和<!ENTITY...>等自定义Entity)的将调用1+2*num(Entity)次该方法。

如:Mark &lt; 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 &lt; 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");
?}

}?

?

?

热点排行