1:SAX -->Simple Api For XML Processer
简单的Api,用于解析xml文件。
特点:
仅能向前读取数据。
不会将任何的数据,保存到内存中。
速度最快。
不能修改数据。只能读取数据。
SaxParser
DefaultHandler - 读取数据时的句柄。用于获取读取到了数据的哪个位置。
2:通过SAX读取xml中的数据
//通过SAX读取xml中的文件
@Test
public void test() throws Exception{
//创建sax解析器,用于读取xml文件
SAXParser sax=SAXParserFactory.newInstance().newSAXParser();
//解析xml文件
sax.parse(new FileInputStream("./xml/studs.xml"), new DefaultHandler(){
private boolean boo=false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if(qName.equals("stud")){
String id =attributes.getValue("id");
System.err.println(id);
}else if(qName.equals("name") ||qName.equals("age")||qName.equals("addr")){
boo=true;
}
}
//用于读取数据
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(boo){
String str=new String(ch,start,length);
System.err.println(str);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("name") ||qName.equals("age")||qName.equals("addr")){
boo=false;
}else if(qName.equals("stud")){
System.err.println("----------");
}
}
});
}
执行结果:
3:通过SAX将所有的数据封装成List<Bean>
//通过SAX将所有的数据封装成List<Bean>
@Test
public void test1() throws Exception {
// A:声明一个集合类
List<Stud> list = new ArrayList<>();
// 创建Sax解析器,用于读取XML文件
SAXParser sax = SAXParserFactory.newInstance().newSAXParser();
// 解析xml文件
sax.parse(new FileInputStream("./xml/studs.xml"), new DefaultHandler() {
private String qName = null;
// B:声明Stud对象
private Stud stud = null;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
// B:每一个<Stud>开始,就是一个新的学生
if (qName.equals("stud")) {
stud = new Stud();
String id = attributes.getValue("id");
stud.setId(id);
} else if (qName.equals("name") || qName.equals("age") || qName.equals("addr")) {
this.qName = qName;
}
}
// 用于读取数据
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (this.qName != null) {
String str = new String(ch, start, length);
try {
BeanUtils.setProperty(stud, this.qName, str);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("name") || qName.equals("age") || qName.equals("addr")) {
this.qName = null;
} else if (qName.equals("stud")) {
list.add(stud);
stud = null;
}
}
});
System.err.println("结果是:" + list);
}