java中XML文档解析3 (sax和stax的使用)

sax解析

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数 据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比 它的替代者DOM快许多。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定 的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据 时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
- 思想:利用监听的思想

解析xml的步骤:
注意:一定要按步骤

        SAXParserFactory spf=SAXParserFactory.newInstance();//1
        SAXParser parse=spf.newSAXParser();//2
        XMLReader read=parse.getXMLReader();//3
        read.setContentHandler(new DefaultHandler(){//4核心步骤
            //继承想实现的方法(监听)


        });
        read.parse("./xml4/users.xml");//5解析

例子:
* 需求:输出xml文档的数据信息,格式如下:
* id:A001
name:Jack
age:25
————
id:A002
name:张三
age:80
———–

SAXParserFactory spf=SAXParserFactory.newInstance();
        SAXParser parser=spf.newSAXParser();
        XMLReader read=parser.getXMLReader();

        read.setContentHandler(new DefaultHandler(){
            private String qElementName="!@#";
            @Override
            public void startElement(String uri, String localName,
                    String qName, Attributes attributes) throws SAXException {
                if(qName.equals("user")){
                    System.out.println("id:"+attributes.getValue(qName));
                }else if(qName.equals("name")||qName.equals("age")){
                    qElementName=qName;
                }
            }

            @Override
            public void endElement(String uri, String localName, String qName)
                    throws SAXException {
                if(qName.equals("name")||qName.equals("age")){
                    qElementName="!@#";
                }
            }

            @Override
            public void characters(char[] ch, int start, int length)
                    throws SAXException {
                if(qElementName!="!@#"){
                    System.out.println(new String(ch,start,length));
                }
            }

        });
        read.parse("./xml4/users.xml");

Stax

StAX的来历
在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API forXML).由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本),JDK6里面JAXP的版本就是1.4。
StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
用到的类:javax.xml.stream.XMLEventReader;
javax.xml.stream.XMLInputFactory;
javax.xml.stream.events.XMLEvent;
Stax只是sax的改进版

例子:

XMLInputFactory xef=XMLInputFactory.newFactory();
        XMLEventReader reader=xef.createXMLEventReader(new FileReader("./xml4/users.xml"));
        while(reader.hasNext()){
            XMLEvent xe=reader.nextEvent();
            if(xe.isStartElement()){
                StartElement se=xe.asStartElement();
                if(se.getName().getLocalPart().equals("user")){
                    System.out.println("id:"+se.getAttributeByName(new QName("id")).getValue());
                }
                if(se.getName().getLocalPart().equals("name")){
                    Characters chs=reader.nextEvent().asCharacters();
                    System.out.println("name:"+chs);
                }
                if(se.getName().getLocalPart().equals("age")){
                    Characters chs=reader.nextEvent().asCharacters();
                    System.out.println("age:"+chs);
                }
            }
            if(xe.isEndElement()){
                EndElement ee=xe.asEndElement();
                if(ee.getName().getLocalPart().equals("user")){
                    System.out.println("____________");
                }

            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值