使用SAX方式解析XML文件

来源:互联网 发布:华大基因与阿里云 编辑:程序博客网 时间:2024/05/01 00:07

SAX方式解析XML的步骤:

1、通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory

2、SAXParseFactory实例的newSAXParse()方法返回SAXParser实例parser

3、创建一个类继承DefaultHandle,重写方法进行业务已处理,创建这个类的实例handle


新建一个XML文件demo.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?><bookstore>  <book id="1">     <name>放学后</name>     <author>lcb</author>     <year>2010</year>     <price>25</price>  </book>  <book id="2">     <name>你的孤独,虽败犹荣</name>     <author>刘同</author>     <year>2011</year>     <price>30</price>  </book></bookstore>

新建SAXHandler.java类并继承DefaultHandle,并重写startElement()、endElement()、startDocument()、endDocument()方法

package com.imooc.io;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXHandler extends DefaultHandler {     /**      * 解析XML的开始标签      */public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// TODO Auto-generated method stubsuper.startElement(uri, localName, qName, attributes);//开始解析book元素if(qName.equals("book")){//已知book元素属性的名称,根据属性名获取属性值//String value = attributes.getValue("id");//System.out.println("book的属性值是:"+value);//获取book元素属性的长度int num = attributes.getLength();for(int i = 0; i<num; i++){System.out.println("book元素第"+(i+1)+"个属性名是:"+attributes.getQName(i));System.out.println("book元素第"+(i+1)+"个属性值是:"+attributes.getValue(i));}}//如果不是book标签和bookstore标签,进行输出节点名else if(!qName.equals("book") && !qName.equals("bookstore")){System.out.println("节点名是:"+qName);}}/** * 用于获取节点名对应的节点值 */@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);//使用String(byte[] bytes,int offset,int length)构造方法把字符数组传递进去String value = new String(ch, start, length);/** * 因为characters解析时会把多余空格一起解析,造成输出多余空格, * 用trim方法去除空格后,并且不等于空格后才进行输出 */if(!value.trim().equals("")){System.out.println(value);}}/** * 解析XML的结束标签 */public void endElement(String uri, String localName, String qName) throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, qName);}/** * 用来标识解析xml文档的开始 */public void startDocument() throws SAXException {// TODO Auto-generated method stubsuper.startDocument();System.out.println("SAX开始解析XML");}/** * 用来标识解析xml文档的结束 */public void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();System.out.println("SAX解析XML完成");}}



在新建SAXTest.java,进行测试:

package com.imooc.io;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;public class SAXtest {public static void main(String[] args){//通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factorySAXParserFactory factory = SAXParserFactory.newInstance();try {//SAXParseFactory实例的newSAXParse()方法返回SAXParser实例parserSAXParser parser = factory.newSAXParser();//创建SAXHandler的对象SAXHandler handler = new SAXHandler();parser.parse("demo.xml", handler);} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

运行结果为:

SAX开始解析XML
book元素第1个属性名是:id
book元素第1个属性值是:1
节点名是:name
放学后
节点名是:author
lcb
节点名是:year
2010
节点名是:price
25
book元素第1个属性名是:id
book元素第1个属性值是:2
节点名是:name
你的孤独,虽败犹荣
节点名是:author
刘同
节点名是:year
2011
节点名是:price
30
SAX解析XML完成

0 0