JAXP SAX模式解析xml文档

  1. 新建java project,在src下建包xml,在包下建book.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<书架>
    < name="yyyyyy" id="111">
        <售价>20元</售价>    
        <书名>Java就业培训教程</书名>
        <作者>张孝祥</作者>    
    </>
    <>
        <书名>JavaScript网页开发</书名>
        <作者>张孝祥</作者>
        <售价>28.00元</售价>
    </>

</书架>

2.在src下建包cn.itcast.sax,在包下建一个public类Demo和 两个默认类myhandler(用于显示book.xml的所有内容), myhandler2(用于处理显示book.xml的指定内容),具体代码如下:

package cn.itcast.sax;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Demo1 {
//采用SAX方法解析xml文档
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //1.使用SAXParserFactory创建SAX解析工厂
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //2.通过SAX解析工厂得到解析器对象
        SAXParser sp=spf.newSAXParser();
        //3.通过解析器对象得到一个XML的读取器
        XMLReader reader=sp.getXMLReader();
        //4.设置读取器的事件处理器,处理事件需要自己编写,并且必须在解析xml文件之前加载
        reader.setContentHandler(new myHandler2());
        //5.解析xml文件
        reader.parse("src/xml/book1.xml");

    }   
}

class myHandler implements ContentHandler{
       //myHandler实现ContentHandler接口需要实现ContentHandler的所有方法
       //当一些方法用不到时,可以让该方法什么都不做,保持空的方法体
        //myHandler处理器输出book1.xml的所有内容
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes atts) throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("当前解析到:"+qName+",这个标签是开始标签");
            for(int i=0;i<atts.getLength();i++){
                //输出当前标签的属性和属性值
                String at_name=atts.getQName(i);
                String at_value=atts.getValue(i);
                System.out.println(at_name+"="+at_value);
            }           
        }

        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("标签内容为:"+new String(ch,start,length));
        }

        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("当前解析到:"+qName+",这个标签是结束标签");

        }

        //下面的方法用不到,只保留空的方法体,让方法不做任何操作
        @Override
        public void setDocumentLocator(Locator locator) {
            // TODO Auto-generated method stub

        }

        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub

        }

        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub

        }

        @Override
        public void startPrefixMapping(String prefix, String uri)
                throws SAXException {
            // TODO Auto-generated method stub

        }

        @Override
        public void endPrefixMapping(String prefix) throws SAXException {
            // TODO Auto-generated method stub

        }

        @Override
        public void ignorableWhitespace(char[] ch, int start, int length)
                throws SAXException {
            // TODO Auto-generated method stub

        }

        @Override
        public void processingInstruction(String target, String data)
                throws SAXException {
            // TODO Auto-generated method stub

        }

        @Override
        public void skippedEntity(String name) throws SAXException {
            // TODO Auto-generated method stub

        }

}

class myHandler2 extends DefaultHandler{
    //DefaultHandler是对ContentHandler接口的默认实现
    //myHander2继承DefaultHandler类便不需要重新实现ContentHandler接口的所有方法
    //myHander2只需要重载DefaultHandler中需要用到的方法
    //myHander2获取book.xml文档中指定的内容,此处用于获取book.xml文档的第一个售价值
    boolean isok=false;//用于判定是否是需要获得的标签
    int index=1;//当有多个相同的标签时,用于输出第index个标签值
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes atts) throws SAXException {
        // TODO Auto-generated method stub
        if(qName.equals("售价")){
            isok=true;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if(isok && index==1){
            System.out.println("书的价格:"+new String(ch,start,length));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if(qName.equals("售价")){
            isok=false;
            index++;
        }       
    }   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值