最后,SAX2姜通过characters方法报告字符数据;下面的实现将会把所有的字符数据打印到屏幕上;因为它需要对特殊字符做专门处理,所以会花费较长时间: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");
    }注意,SAX驱动会按照自己的方式随意组织字符数据成块,因此,你不能指望一个元素内容所有的字符数据都能被一个characters事件所捕获。*SAX2应用实例以下是一个完整的例子程序(再强调一下,在真实的应用中,各事件处理器可能分别由不同的类实现):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,名为com.example.xml.SAXDriver(实际上根本不存在这样的驱动)的SAX2驱动被部署在你的classpath中,你可以这样调用例子程序:java -Dorg.xml.sax.driver=com.example.xml.SAXDriver MySAXApp roses.xml运行后,得到如下结果:Start document
Start element: {http://www.megginson.com/ns/exp/poetry}poem
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}title
Characters:    "Roses are Red"
End element:   {http://www.megginson.com/ns/exp/poetry}title
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Roses are red,"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Violets are blue;"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Sugar is sweet,"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "And I love you."
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
End element:   {http://www.megginson.com/ns/exp/poetry}poem
End document注意这个短文档所产生的(至少)25个事件:所用到的六个元素的开始和结束(活着,你愿意的话,一个开始标签,一个结束标签),11个字符数据块(包括元素间的空白),一个文档开始标签,一个文档结束标签。如果输入文档不包括xmlns="http://www.megginson.com/ns/exp/poetry"属性来声明所有元素都在此名称空间中,则输出结果会如下所示:Start document
Start element: poem
Characters:    "\n"
Start element: title
Characters:    "Roses are Red"
End element:   title
Characters:    "\n"
Start element: l
Characters:    "Roses are red,"
End element:   l
Characters:    "\n"
Start element: l
Characters:    "Violets are blue;"
End element:   l
Characters:    "\n"
Start element: l
Characters:    "Sugar is sweet,"
End element:   l
Characters:    "\n"
Start element: l
Characters:    "And I love you."
End element:   l
Characters:    "\n"
End element:   poem
End document你很可能两种类型的文档都会用到:有的使用XML名称空间,有的不使用。你处理的文档中也可能有的元素(属性)有名称空间,而有的却没有。要确定你的程序中有检测名称空间URI的代码,而不能假定程序处理的文档总有名称空间URI(或总是没有名称空间URI)。根据SAX Quickstart整理,原文见:http://www.saxproject.org/quickstart.html