java基礎整合--手寫web伺服器---xml解析(基礎)
SAX解析是一種XML解析的替代方法。相比於DOM,SAX是一種速度更快,更有效的方法。它逐行掃描文件,一邊掃描一邊解析。相比於DOM,SAX可以在解析文件的任意時刻停止解析。
1.SAX解析基本流程
p.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>張三</name>
<age>11</age>
</person>
<person>
<name>李四</name>
<age>22</age>
</person>
</persons>
基本解析流程
//1.獲取解析工廠
SAXParserFactory factory = SAXParserFactory .newInstance();
//2.從解析工廠獲取解析器
SAXParser parse = factory.newSAXParser();
//3.編寫處理器
//4.載入xml文件註冊處理器
PHandler handler = new PHandler();
//5.解析
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/test/xmlsax/p.xml"), handler);
編寫處理器
class PHandler extends DefaultHandler{
//解析文件開始
@Override
public void startDocument() 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 characters(char[] ch, int start, int length) throws SAXException {
String contexts = new String(ch,start,length);
System.out.println(contexts);
}
//解析標籤結束
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName);
}
//解析文件結束
@Override
public void endDocument() throws SAXException {
System.out.println("解析文件結束");
}
}
6.解析過程中的資料儲存
根據xml的標籤建立實體類Person,並建立對應的子標籤屬性,生產構造方法和get/set方法
Person.java
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name ,int age) {
super();
this.age = age;
this.name = name;
}
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 PersonHandler extends DefaultHandler{
private List<Person> persons;//儲存解析內容
private Person person;
private String tag;
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(null!=qName) {
tag = qName;
if(qName.equals("person")) {
person = new Person();
}
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contexts = new String(ch,start,length).trim();
if(null!=tag) {
if(tag.equals("name")) {
person.setName(contexts);
}else if(tag.equals("age")){
if(contexts.length()>0) {
person.setAge(Integer.valueOf(contexts));
}
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(null!=qName) {
if(qName.equals("person")) {
persons.add(person);
}
}
tag = null;
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文件結束");
}
}