解析XML文件,SAX解析案例
XML解析的四种方法
DOM解析:
- 把文档中的所有元素出现的层次关系,在内存中构造出树形结构。
- 优点是可以遍历和修改节点的内容。
- 缺点是内存压力大,解析较慢。
SAX解析:
- 是一种XML解析的替代方法。
- 相比DOM方式,SAX是一种速度更快,更有效的方法。
- 缺点:不能修改节点内容。
JDOM解析:
- 仅适用具体的类,而不适用接口,不灵活。
DOM4J解析:
- 是JDOM的一种智能分支,合并了许多超出基本XML文档的功能。
SAX解析
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
import com.entity.Person;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
public class PersonHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String tag;//存储操作标签
// @Override
public void startDocument() throws SAXException {
System.out.println("-----------解析开始-----------");
persons = new ArrayList<Person>();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("-----------解析结束----------");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("正在解析:<" + qName + ">");
if (null != qName) {
tag = qName;//存储标签名
}
if (tag.equals("person")) {
person = new Person();
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (null != qName) {
if (qName.equals("person")) {
persons.add(person);
}
}
tag = null;
System.out.println("正在解析</" + qName + ">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contents = new String(ch, start, length).trim();
if (null != tag) {
if (tag.equals("name")) {
person.setName(contents);
} else if (tag.equals("age")) {
if (tag.length() > 0) {
person.setAge(Integer.valueOf(contents));
}
}
}
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class XMLTest1 {
public static void main(String[] args) throws Exception {
// 获取解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//从工厂获取解析器
SAXParser parser = factory.newSAXParser();
//加载文档document注册处理器
// 编写处理器
PersonHandler personHandler = new PersonHandler();
//解析;注意这里加载XML文件的路径他是从线程里面加载的
parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml"), personHandler);
//打印数据
System.out.println(personHandler.getPersons().toString());
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>小明</name>
<age>16</age>
</person>
<person>
<name>小红</name>
<age>5</age>
</person>
</persons>
作者:-亚州Asu-
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
tips:你的点赞我都当成了喜欢~