天天看點

SAX2 - (Simple API to XML) Quickstart中文翻譯

快速入門

這篇文檔為打算在項目中使用SAX2的Java程式員提供一個快速的指南。

環境要求

SAX是一個被一些不同的XML解析器(或類似XML解析器的東西)繼承的通用接口,就像JDBC是一個被不同的關系型資料庫(或類似關系型資料庫的東西)所繼承的通用接口。如果你打算使用SAX,你需要滿足如下要求:

  • Java1.1或更高
  • 一個與SAX2相适應的 XML解析器在classpath環境變量下(如果你需要這樣的一個解析器,請檢視左側連結。http://www.saxproject.org/  (例如我使用并下載下傳的是Xerces-J)**
  • SAX2表述檔案安裝在classpath環境變量下。(This probably came with your parser.)

多數JAVA/XML工具表述包涵一個解析器用到的SAX2。多數網絡程式服務需要它作為核心的XML支援。特别指出,JAXP1.1環境支援當中包括SAX2。

解析一個文檔

準備去建立一個繼承DefaultHandler類的類檔案:

import org.xml.sax.helpers.DefaultHandler;

public class MySAXApp extends DefaultHandler
{

    public MySAXApp ()
    {
	super();
    }

}

           

 一旦建立一個Java應用,我們需要建立一個利用XMLReaderFactory類的CreateXMLReader方法去動态選擇一個SAX驅動的靜态的main方法。注意“throws Exception"通常是用不到的;真正的應用當中或許需要真正的錯誤處理:

public static void main (String args[])
	throws Exception
    {
	XMLReader xr = XMLReaderFactory.createXMLReader();
    }
           

一個簡單的完整程式代碼如下:

import java.io.FileReader;

import org.xml.sax.XMLReader;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.helpers.DefaultHandler;


public class MySAXApp extends DefaultHandler
{

    public static void main (String args[])
	throws Exception
    {
	XMLReader xr = XMLReaderFactory.createXMLReader();
	MySAXApp handler = new MySAXApp();
	xr.setContentHandler(handler);
	xr.setErrorHandler(handler);

				// Parse each file provided on the
				// command line.
	for (int i = 0; i < args.length; i++) {
	    FileReader r = new FileReader(args[i]);
	    xr.parse(new InputSource(r));
	}
    }


    public MySAXApp ()
    {
	super();
    }


    
    // Event handlers.
    


    public void startDocument ()
    {
	System.out.println("Start document");
    }


    public void endDocument ()
    {
	System.out.println("End document");
    }


    public void startElement (String uri, String name,
			      String qName, Attributes atts)
    {
	if ("".equals (uri))
	    System.out.println("Start element: " + qName);
	else
	    System.out.println("Start element: {" + uri + "}" + name);
    }


    public void endElement (String uri, String name, String qName)
    {
	if ("".equals (uri))
	    System.out.println("End element: " + qName);
	else
	    System.out.println("End element:   {" + uri + "}" + name);
    }


    public void characters (char ch[], int start, int length)
    {
	System.out.print("Characters:    \"");
	for (int i = start; i < start + length; i++) {
	    switch (ch[i]) {
	    case '\\':
		System.out.print("\\\\");
		break;
	    case '"':
		System.out.print("\\\"");
		break;
	    case '\n':
		System.out.print("\\n");
		break;
	    case '\r':
		System.out.print("\\r");
		break;
	    case '\t':
		System.out.print("\\t");
		break;
	    default:
		System.out.print(ch[i]);
		break;
	    }
	}
	System.out.print("\"\n");
    }

}

           

 它另外需要一個XML文檔

<?xml version="1.0"?>

<poem xmlns="http://www.megginson.com/ns/exp/poetry">
<title>Roses are Red</title>
<l>Roses are red,</l>
<l>Violets are blue;</l>
<l>Sugar is sweet,</l>
<l>And I love you.</l>
</poem>
      

  運作指令為:

 如果這個文檔被命名為roses.xml并且SAX2驅動已經加入到classpath環境變量裡(假設驅動的名字是com.example.xml.SAXDriver(這個驅動并不真的存在))你可以解析這個事例應用,用類似下面的指令:

java -Dorg.xml.sax.driver=com.example.xml.SAXDriver MySAXApp roses.xml 
           

 注意:

這裡的com.example.xml.SAXDriver嘗嘗被替換為目前被廣泛使用的驅動例如

Class Name Notes

gnu.xml.aelfred2.SAXDriver

Lightweight non-validating parser; Free Software

gnu.xml.aelfred2.XmlReader

Optionally validates; Free Software

oracle.xml.parser.v2.SAXParser

Optionally validates; proprietary

org.apache.crimson.parser.XMLReaderImpl

Optionally validates; used in JDK 1.4; Open Source

org.apache.xerces.parsers.SAXParser

Optionally validates; Open Source

(以上Class Name均不包含在SAX2文檔包中,需另行下載下傳*此例在 環境要求 裡面的第二條已經要求過,經常會有找不到類的問題,就是因為此原因*)

TODO