關(guān)于XML的解析 中使用SAX解析器

          Posted on 2006-09-25 15:50 開關(guān) 閱讀(293) 評論(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的父類 然后 創(chuàng)建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");
          //有解析器建立攔截器(本例中把本類設(shè)置成為攔截器,也可以設(shè)置別的類)
          ???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);
          ??}
          ??
          ??? }

          }


          解析 結(jié)果如下:
          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


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 南乐县| 凤山市| 读书| 赞皇县| 微山县| 博罗县| 军事| 石河子市| 丰顺县| 凤冈县| 巴中市| 宣威市| 东乡族自治县| 名山县| 竹山县| 依安县| 乌兰浩特市| 灌云县| 文安县| 炉霍县| 顺昌县| 赞皇县| 惠水县| 安远县| 博客| 武穴市| 若羌县| 剑阁县| 呼图壁县| 镇平县| 镇坪县| 瑞金市| 江北区| 珲春市| 湖南省| 衡东县| 保靖县| 沙坪坝区| 凤翔县| 沾益县| 巫溪县|