class Example6Triangle extends DefaultHandler {
 
 
     // 当前三角形的本地引用...         private Triangle currentTriangle;
     // Parent...    ContentHandler parent;
     // XML 解析器    XMLReader parser;
    // 从"characters" SAX事件中收集数据的缓存。    private CharArrayWriter contents = new CharArrayWriter();
 
     public void collectTriangle( XMLReader parser,                ContentHandler parent,                Triangle newTriangle ) {       this.parent = parent;       this.parser = parser;       parser.setContentHandler( this );       currentTriangle = newTriangle;    }
 
 
     public void endElement( String namespaceURI,                String localName,               String qName ) throws SAXException {
 
        if ( localName.equals( "x" ) ) {                           currentTriangle.x =                               Integer.valueOf                              (contents.toString().trim()).intValue();       }
        if ( localName.equals( "y" ) ) {                           currentTriangle.y =                              Integer.valueOf                             (contents.toString().trim()).intValue();       }
        if ( localName.equals( "width" ) ) {                           currentTriangle.width =                               Integer.valueOf                              (contents.toString().trim()).intValue();       }
        if ( localName.equals( "height" ) ) {                           currentTriangle.height = Integer.valueOf                              (contents.toString().trim()).intValue();       }
        if ( localName.equals( "Triangle" ) ) {                     // 把内容处理器(content handler)换回成parent          parser.setContentHandler(parent);       }
 
 
     }
     public void characters( char[] ch, int start, int length )                   throws SAXException {       // 从"characters" SAX事件中收集数据到缓存。       contents.write( ch, start, length );
     }
 
  } 
注意我们得到了来自shape类的相同输出: 
 Example6: Circle: circ1 x: 10 y: 10 width: 3 height: 3 Square: sq1 x: 0 y: 0 width: 3 height: 3 Triange: tri1 x: 3 y: 0 width: 5 height: 3 Triange: tri2 x: 5 y: 0 width: 5 height: 3 
结论  我们以经论证,当处理得当时SAX较DOM API有很多优势。我们已经涉及到了一些基本的可以让我们高效处理简单及中等复杂度的XML文档的一些理论。我们也指出了使用SAX API的一些要谨慎处理的地方。 
最后,我希望当你因为在苛刻的环境中使用DOM API而感到进退两难时会想到SAX API。  
在下一篇文章中,我们将解决递归XML结构、混用标签名及SAX数据导航方面的问题。这三个总线贯穿于一个集中处理了容器管理,能够应对最复杂的XML映射的通用类库。  
  
关于作者 Bob Hustead has been wasting way too much time on computers since the Commodore 64 was introduced. 他起初致力于C语言的通信协议与设备驱动开发,后来转移到面象对象设计领域,先是C++后来又是Java。再后来转而致力于中间件架构。Bob目前是一名企业应用底层架构师,效力于纽约城的AIG Insurance。 
资源  
一些废话(译者) 所以想要翻译这篇文章,是因为半月前工作很少,闲来无事。自已又一惯对别人用机器做翻译很有意见,认为简直就是对技术文档的强奸,所以立志要做一篇出来“让某些人瞧瞧什么才叫翻译”。其实也有不单纯的成份。其间工作突然多起来,几欲罢手,但是已经向原作者说过了要做出来,尽管别人不会理会我们这等小角色,总觉得过意不去。现在看起来,自已也做得希里糊涂的,要真的做好一个文章还是真不容易。其实我一直希望能有多的影印版——又省钱看的又好受。真要找学问还得看英文的,技术文档比起其它的英文文档来实在只能算是儿童读物的难度,只要不一开始就给吓住了J 这篇文章还有一个第二部分,如果大家要求,我就勉为其难了,当然最好是有高手相助。  
 
  |