XML的JAVA 解析(一)(7)

本文通过代码示例展示了使用SAX API处理XML文档的过程,论证了处理得当时SAX较DOM API有诸多优势,还提及了使用SAX API需谨慎之处。最后表示下一篇文章将解决递归XML结构等方面的问题,并提供了相关资源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

结论
我们以经论证,当处理得当时SAXDOM 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 这篇文章还有一个第二部分,如果大家要求,我就勉为其难了,当然最好是有高手相助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值