XML之Sax(simple api for xml )解析:
主实现类:
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.junit.Test;
import org.xml.sax.SAXException;
/*
* Sex解析的特点:
* 1.基于事件的读取
* 2.基于顺序的读取,速度快
* 3.不能任意读取节点(灵活性差一些)
* 4.sex更适用于在要求跟高的设备上使用(Android开发中);
* 5.解析时占用内存小
*/
public class ImplementsXML {
@Test
public static void saxparsemxl() {
//1.创建一个sax解析工厂对象
SAXParserFactory spf=SAXParserFactory.newInstance();
//2.通过工厂对象创建sax解析器
try {
SAXParser sp= spf.newSAXParser();
//3.创建一个数据处理器(需要我们自己来编写)
dataParser dp=new dataParser();
//4.开启解析
InputStream is= Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
try {
//参数一输入文件字节流 /参数二 自己编写的数据处理器
sp.parse(is,dp);
ArrayList<person> p=dp.getPersons();
//通过for循环输出对象
for(person p1:p) {
System.out.println(p1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
//调用解析xml的方法
saxparsemxl();
}
}
数据处理器类:
package com.xml;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class dataParser extends DefaultHandler {
private ArrayList<person> persons=new ArrayList<person>();
private person p;//当前正在解析的person对象
private String tag;//用于记录正在解析的标签名
public ArrayList<person> getPersons() {
return persons;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
;
System.out.println("开启解析文档>>>>>>>>>");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文档解析结束.");
}
//解析开始元素时调用
/*
* String 命名空间, String 不带前缀的标签名字, String 不带前缀的标签名字, Attributes 当前标签的属性集合
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
//表示解析到了person标签
if("person".equals(qName)) {
p=new person();
String id=attributes.getValue("person");
//设置id
p.setId(id);
}
tag=qName;
System.out.println("startElement"+qName);
}
//解析结束元素时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if("person".equals(qName)) {
persons.add(p);
tag=null;
}
System.out.println("endElement"+qName);
}
//解析文本时调用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if(tag !=null) {
if("name".equals(t