SAX和StAX的用法

SAX:----------------------------------------------------------------------------------------------------

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

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

public class SaxDemo {
    
    @Test
    public void hello() throws Exception{
        /*技术要点:
          1)用javax.xml.parsers包中的类去获取一个"XML阅读器"org.xml.sax.XMLReader
          2)用这个"XML阅读器"去解析我们的XML文档---因为是只读,所以解析就是阅读
          3)※以给阅读器添加监听者的方式来设置具体的解析方案---该方案由"监听者"来决定
          
       */
        SAXParser sax = SAXParserFactory.newInstance().newSAXParser();
        XMLReader reader = sax.getXMLReader();
        
        ///////////我们以后解析时真正需要写的就是下面这一小段有技术含量,其它都可以照搬////////////////
        //※给reader注册(添加)一个监听者,由监听者来设置解析方案
        reader.setContentHandler(new DefaultHandler(){

            @Override
            public void startDocument() throws SAXException {
                System.out.println("开始解析文档了.....");
            }

            @Override
            public void endDocument() throws SAXException {
                System.out.println("文档解析结束了.....");
            }

            @Override
            public void startElement(String uri, String localName,
                    String qName, Attributes attributes) throws SAXException {
                System.out.println("一个元素开始,名字为:"+qName);
            }

            @Override
            public void endElement(String uri, String localName, String qName)
                    throws SAXException {
                System.out.println("一个元素结束,名字为:"+qName);
            }
            
        });
        
        
        //解析动作的触发
        reader.parse("./xml/users3.xml");
        
    }
    
    @Test
    public void getInfoDemo() throws Exception{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        XMLReader reader = parser.getXMLReader();
        
        ////////设置解析方式///////////
        ContentHandler handler = new DefaultHandler(){
            private String elementName="";
            
            @Override //遇到元素开始时执行这个事件处理方法
            public void startElement(String uri, String localName,
                    String qName, Attributes attributes) throws SAXException {
                if("user".equals(qName)){
                    String id = attributes.getValue("id");
                    System.out.println("id:"+id);
                }else if("name".equals(qName) || "age".equals(qName)){
                    elementName=qName;
                }
            }

            @Override
            public void endElement(String uri, String localName, String qName)
                    throws SAXException {
                if("name".equals(qName) || "age".equals(qName)){
                    elementName="";
                }else if("user".equals(qName)){
                    System.out.println("-----------------");
                }
            }

            @Override //遇到文本内容节点时执行
            public void characters(char[] ch, int start, int length)
                    throws SAXException {
                if(!"".equals(elementName)){
                    System.out.println(elementName+":"+new String(ch,start,length));
                }
            }
            
        };
        reader.setContentHandler(handler);
        
        reader.parse("./xml/users.xml");
    }
    
}
StAX:------------------------------------------------------------------------------------------------------------------------------

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import org.junit.Test;

public class StAXDemo {
    
    @Test
    public void readDemo() throws Exception{
        //先获得一个StAX阅读器
        XMLInputFactory factory = XMLInputFactory.newFactory();
        XMLEventReader reader = factory.createXMLEventReader(new FileInputStream("./xml/users.xml"));
        
        while(reader.hasNext()){
            XMLEvent ev = reader.nextEvent();
            
            if(ev.isStartElement()){
                StartElement se = ev.asStartElement(); //强转成"StartElement",以便于调用该类中的方法---定义了一些元素开始时可以做的动作
                if( se.getName().getLocalPart().equals("user") ){ //<user>的开始标记
                    //属性是开始标签中的,因此这里的id属性直接从se中获取
                    String id = se.getAttributeByName( new QName("id") ).getValue();
                    System.out.println("id:"+id);
                }else if( se.getName().getLocalPart().equals("name") ){ //<name>的开始标记
                    //"文本内容"不属于"开始标签本身",而是它的孩子,因此"文本内容"是"开始标签"的下一个事件对象
                    XMLEvent evv = reader.nextEvent();
                    //因为我们知道evv就是文本内容,所以可以直接强转,以便于调用Characters类中的一些方法
                    Characters chs = evv.asCharacters();
                    System.out.println("name:"+chs);
                }else if( se.getName().getLocalPart().equals("age") ){ //<age>的开始标记
                    Characters chs =reader.nextEvent().asCharacters();
                    System.out.println("age:"+chs);
                }
            } else if(ev.isEndElement()){
                EndElement ee = ev.asEndElement();
                if(ee.getName().getLocalPart().equals("user")){
                    System.out.println("----------------");
                }
            }
        }
    }
    
}
 

猜你喜欢

转载自blog.csdn.net/qq_35307947/article/details/82082506
Sax
今日推荐