首先这是SAX解析XML的标准流程:
public class XML {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory=SAXParserFactory.newInstance();//获取解析工厂
SAXParser Parse=factory.newSAXParser();//从解析工厂获得解析器
PHandler handler=new PHandler();//自己编写的处理器类
Parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("cn/xjh3/Net/WebServer/person.xml"),handler);
//加载文档注册处理器,包名以及xml文件名,包名需要改成/分割
}
}
接着是自己编写的处理器类:
class PHandler extends DefaultHandler {//继承DefaultHandler类,必要条件
@Override
public void startDocument() throws SAXException {
System.out.println("解析文档开始");
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName+"---->解析开始");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName+"---->解析结束");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contents=new String(ch,start,length).trim();//trim去掉空
if(contents.length()>0){ System.out.println("内容为"+contents);}
else{
System.out.println("内容为空");
}
}
}
版本二:
读取文件后加上处理数据的方法:
首先写一个类来存储数据
public class Person {
String name;
int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
}
然后在处理器类内加上容器来存储数据转换的对象:
class PHandler extends DefaultHandler {//继承DefaultHandler类,必要条件
private List<Person> Persons;//定义一个容器
private Person person;//定义一个类来存储数据
String tag;
@Override
public void startDocument() throws SAXException {
Persons=new ArrayList<Person>();
System.out.println("解析文档开始");
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName+"---->解析开始");
tag=qName;
if(tag.equals("person")){person=new Person();}//如果解析到person标签,则新建一个类来存储
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName+"---->解析结束");
if(qName.equals("person")){Persons.add(person);}//把类加入容器内
tag=null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(tag!=null){//处理了,解析完一个标题后空内容的情况
String contents=new String(ch,start,length).trim();//trim去掉空
if(tag.equals("name")){person.setName(contents);}
else if(tag.equals("age")){
if(contents.length()>0){person.setAge(Integer.valueOf(contents));}
}
}}
public List<Person> getPersons() {//得到Handler解析文件获得的的所有对象
return Persons;
}
}
在最上方main方法内加入代码,得到数据:
List <Person> l=handler.getPersons();
for(Person p:l){
System.out.println(p.name+p.age);
}
最后附上xml文件内容:
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person>
<name>库里</name>
<age>30</age>
</person>
</persons>