关于XML的解析 中使用SAX解析器

Posted on 2006-09-25 15:50 开关 阅读(285) 评论(0)  编辑  收藏 所属分类: XML

例如一个Example.xml文件如下:
<?xml version="1.0"?>
 <Shapes>
  <Triangle name="tri1" >
      <x> 3 </x>
      <y> 0 </y>
      <height> 3 </height>
      <width> 5 </width>
  </Triangle>
  
  <Triangle name="tri2">
      <x> 5 </x>
      <y> 0 </y>
      <height> 3 </height>
      <width> 5 </width>
  </Triangle>  
 
  <Square name="sq1" >
      <x> 0 </x>
      <y> 0 </y>
      <height> 3 </height>
      <width> 3 </width>
  </Square>
 
  <Circle name="circ1" >
     <x> 10 </x>
      <y> 10 </y>
      <height> 3 </height>
      <width> 3 </width>
  </Circle>
 </Shapes>

我写的解析算法是:
先建立一个shape的父类 然后 创建Triangle ,Cricle,和Square的子类分别继承 但是子类有自己的name属性
然后建立解析类coding如下:
import java.util.ArrayList;
import java.util.List;

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

public class ParserOne extends DefaultHandler {
 Triangle tri;
 Square   squ;
 Circle   cir;
 List trislist=new ArrayList();
 List squslist=new ArrayList();
 List cirslist=new ArrayList();
 StringBuffer sb=new StringBuffer();
 boolean triangle=false;
 boolean square=false;
 boolean circle=false;
 @Override
 public void startDocument() throws SAXException {
  // TODO 自动生成方法存根
 
 }
 
 @Override
 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  // TODO 自动生成方法存根
 if(qName.equals("Triangle")){
  tri=new Triangle();
  tri.name=attributes.getValue(0);
  trislist.add(tri);
  triangle=true;
 }else if(qName.equals("Square")){
  squ=new Square();
  squ.name=attributes.getValue(0);
  squslist.add(squ);
  square=true;
 }else if(qName.equals("Circle")){
  cir=new Circle();
  cir.name=attributes.getValue(0);
     cirslist.add(cir);
     circle=true;
 }    sb.delete(0, sb.length());
 }
 
 
 @Override
 public void characters(char[] ch, int start, int length) throws SAXException {
  // TODO 自动生成方法存根
  sb.append(ch,start,length);
 }

 @Override
 public void endElement(String uri, String localName, String qName) throws SAXException {
  // TODO 自动生成方法存根
 if(triangle){
  if(qName.equals("x")){
     tri.x=Integer.parseInt(sb.toString().trim());
  }else if(qName.equals("y")){
     tri.y=Integer.parseInt(sb.toString().trim());
  }else if(qName.equals("height")){
     tri.height=Integer.parseInt(sb.toString().trim());
  }else if(qName.equals("width")){
        tri.width=Integer.parseInt(sb.toString().trim());
  }
 }else if(square){
  if(qName.equals("x")){
       squ.x=Integer.parseInt(sb.toString().trim());
   }else if(qName.equals("y")){
    squ.y=Integer.parseInt(sb.toString().trim());
   }else if(qName.equals("height")){
    squ.height=Integer.parseInt(sb.toString().trim());
   }else if(qName.equals("width")){
    squ.width=Integer.parseInt(sb.toString().trim());
   } 
 }else if(circle){
  if(qName.equals("x")){
      cir.x=Integer.parseInt(sb.toString().trim());
  }else if(qName.equals("y")){
   cir.y=Integer.parseInt(sb.toString().trim());
  }else if(qName.equals("height")){
   cir.height=Integer.parseInt(sb.toString().trim());
  }else if(qName.equals("width")){
   cir.width=Integer.parseInt(sb.toString().trim());
  } 
 }
 if(qName.equals("Triangle")){
    triangle=false;
    }
    if(qName.equals("Square")){
    square=false; 
    }
    if(qName.equals("Circle")){
    circle=false;
    }
 }

    @Override
 public void endDocument() throws SAXException {
  // TODO 自动生成方法存根
 
 }
    public static void main(String[] args){
     ParserOne par=new ParserOne();
     try {
//通过XML阅读工厂建立阅读器(解析器) 这里依托xerces.jar 和里面的SAXparser 路径  (使用SAX  API解析器)
   XMLReader parser=XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
//有解析器建立拦截器(本例中把本类设置成为拦截器,也可以设置别的类)
   parser.setContentHandler(par);
//解析器解析(路径)
   parser.parse("D:/Example.xml");
  } catch (Exception e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }
  for(int i=0;i<par.trislist.size();i++){
   Triangle tr=(Triangle)par.trislist.get(i);
   tr.print(System.out);
  }
  for(int i=0;i<par.squslist.size();i++){
   Square sq=(Square)par.squslist.get(i);
   sq.print(System.out);
  }
  for(int i=0;i<par.cirslist.size();i++){
   Circle ci=(Circle)par.cirslist.get(i);
   ci.print(System.out);
  }
  
    }

}


解析 结果如下:
name:tri1
x:3
y:0
height:3
width:5
name:tri2
x:5
y:0
height:3
width:5
name:sq1
x:0
y:0
height:3
width:3
name:circ1
x:10
y:10
height:3
width:3


只有注册用户登录后才能发表评论。


网站导航: