1. 程式人生 > >java基礎整合--手寫web伺服器---xml解析(基礎)

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("解析文件結束");

       }

}