利用JAXP开发包进行SAX方式进行解析

JAXP进行SAX解析
      SAX解析原理:
          DOM方式必须将XML的DOM树全部加载到内存才能开始读取,若文档过大,易造成内存溢出
          通过读取器读取XML文档,当读到了文档的某一部分时(文档的开始,元素的开始、文本、元素的结束、文档的结束),
          都会调用事件处理器的对应方法,读到的数据,以参数的形式传递给对应的方法。
        
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <书架>
                    <书>
                              <书名>JAVA</书名>
                              <作者>毕向东</作者>
                              <售价>38</售价>
                    </书>
                    <书>
                              <书名>JAVAWEB</书名>
                              <作者>马士兵</作者>
                              <售价>80</售价>
                    </书>
          </书架>


          // 例1: JAXP进行SAX解析原理示例 :                   
          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;


          // JAXP进行SAX解析原理示例 


          public class SAXDemo1 {
                  public static void main(String[] args) throws Exception {
                            // 得到解析工厂SAXParserFactory
                            SAXParserFactory factory = SAXParserFactory.newInstance();
                            // 得到解析器SAXParser
                            SAXParser parser = factory.newSAXParser();
                            // 得到XML读取器: XMLReader
                            XMLReader reader = parser.getXMLReader();
                            // 注册内容/事件处理器: ContentHandler
                            reader.setContentHandler(new MyContentHandler());
                            // 读取XML文档
                            reader.parse("src/book.xml");
                  }
          }


          class MyContentHandler implements ContentHandler {                  
                  // 解析到文档开始时被调用
                  @Override
                  public void startDocument() throws SAXException {
                            System.out.println("解析到了文档的开始");
                  }


                  // 解析到元素开始时被调用  qName:元素名称
                  @Override
                  public void startElement(String uri, String localName, String qName,
                            Attributes atts) throws SAXException {
                            System.out.println("解析到了元素的开始:" + qName);
                  }


                  // 解析到文本内容时被调用 注: 空格换行不能被忽略
                  @Override
                  public void characters(char[] ch, int start, int length)   throws SAXException {
                            System.out.println("文本内容:" + new String(ch,start,length));
                  }


                  // 解析到元素结束时被调用
                  @Override
                  public void endElement(String uri, String localName, String qName)  throws SAXException {
                             System.out.println("解析到了元素的结束:" + qName);
                  }


                  // 解析到文档结束时被调用
                  @Override
                  public void endDocument() throws SAXException {
                             System.out.println("解析到了文档的结束");
                  }


                  @Override
                  public void endPrefixMapping(String prefix) throws SAXException { }


                  @Override
                  public void ignorableWhitespace(char[] ch, int start, int length)    throws SAXException { }


                  @Override
                  public void processingInstruction(String target, String data)    throws SAXException { }


                  @Override
                  public void setDocumentLocator(Locator locator) {  }


                  @Override
                  public void skippedEntity(String name) throws SAXException {  }


                  @Override
                  public void startPrefixMapping(String prefix, String uri)  throws SAXException { }


          }


          *************************************************************************************************************
      
          // 例2:  打印出第2本书的作者
          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;


          public class SAXDemo2 {
       
                  public static void main(String[] args) throws Exception {
                            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
                            XMLReader reader = parser.getXMLReader();
                            reader.setContentHandler(new ContentHandler() {                              
                                        // 是作者: 第2个作者
                                        boolean isAuthor = false;  // 是不是作者标签
                                        int index = 0;  // 作者标签的索引
                                        
                                        @Override
                                        public void startElement(String uri, String localName,  String qName, Attributes atts) throws SAXException {
                                                    if("作者".equals(qName))
                                                          isAuthor = true;
                                        }


                                        @Override
                                        public void characters(char[] ch, int start, int length)   throws SAXException {
                                                    if(isAuthor && index==1){
                                                          System.out.println(new String(ch,start,length));
                                                    }
                                        }


                                        @Override
                                        public void endElement(String uri, String localName, String qName)   throws SAXException {
                                                    if("作者".equals(qName)){
                                                            index++;
                                                    }
                                                    isAuthor = false;
                                        }


                                        @Override
                                        public void endDocument() throws SAXException { }


                                        @Override
                                        public void endPrefixMapping(String prefix) throws SAXException {  }


                                        @Override
                                        public void ignorableWhitespace(char[] ch, int start, int length)  throws SAXException {  }


                                        @Override
                                        public void processingInstruction(String target, String data)   throws SAXException { }


                                        @Override
                                        public void setDocumentLocator(Locator locator) { }


                                        @Override
                                        public void skippedEntity(String name) throws SAXException { }


                                        @Override
                                        public void startDocument() throws SAXException { }


                                        @Override
                                        public void startPrefixMapping(String prefix, String uri) throws SAXException {}
                            });                           
                            reader.parse("src/book.xml");
                          }


          }
          
          *************************************************************************************************************
          
          // 例3:  解析XML中的内容,封装到javaBean中
          先创建一个book的bean类,包含三个字符串类型的字段: name author price,设置setter、getter方法,和 tostring方法
          开始解析:
          import java.util.ArrayList;
          import java.util.List;
          import javax.xml.parsers.SAXParser;
          import javax.xml.parsers.SAXParserFactory;
          import org.xml.sax.Attributes;
          import org.xml.sax.SAXException;
          import org.xml.sax.XMLReader;
          import org.xml.sax.helpers.DefaultHandler;
          import cn.itcast.domain.Book;
          
          public class SAXDemo3 {


                    public static void main(String[] args) throws Exception {
                            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
                            XMLReader reader = parser.getXMLReader();
                            final List books = new ArrayList(); // 存放所有的书
                            reader.setContentHandler(new DefaultHandler() {
                                          Book book = null;
                                          String currentTagName = null;


                                          @Override
                                          public void startElement(String uri, String localName,
                                                    String qName, Attributes attributes) throws SAXException {
                                                    if ("书".equals(qName)) {
                                                          book = new Book();
                                                    }
                                                    currentTagName = qName;
                                          }
                                          
                                          @Override
                                          public void characters(char[] ch, int start, int length)  throws SAXException {
                                                    if("书名".equals(currentTagName)){
                                                           book.setName(new String(ch,start,length));
                                                    }
                                                    if("作者".equals(currentTagName)){
                                                           book.setAuthor(new String(ch,start,length));
                                                    }
                                                    if("售价".equals(currentTagName)){
                                                           book.setPrice(Integer.parseInt(new String(ch,start,length)));
                                                    }
                                          }


                                          @Override
                                          public void endElement(String uri, String localName, String qName) throws SAXException {
                                                  if("书".equals(qName)){
                                                          books.add(book);
                                                          book = null;
                                                  }
                                                  currentTagName = null;
                                          }
                            });
                            reader.parse("src/book.xml");                 
                            // 验证代码
                            for(Object b : books){
                                    System.out.println(b);
                            }
                       }


        }
          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值