真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用SAX方式解析XML文件-創(chuàng)新互聯(lián)

本篇文章為大家展示了如何使用SAX方式解析XML文件,代碼簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有南和免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

Java SAX解析機(jī)制為我們提供了一系列的API來處理XML文件,SAX解析和DOM解析方式不太一樣,它并不是將XML文件內(nèi)容一次性全部加載,而是連續(xù)的部分加載。

javax.xml.parsers.SAXParser類提供了一些函數(shù),采用事件處理方式解析XML文檔,這個(gè)類實(shí)現(xiàn)了XMLReader接口,提供了重載的parse()方法從File,InputStream,SAX InputSource和URI字符串中讀取XML文檔。
實(shí)際的XML解析工作由Handler類來完成,我們需要?jiǎng)?chuàng)建自己的Handler類,這就需要我們實(shí)現(xiàn)org.xml.sax.ContentHandler接口。這個(gè)接口中包含當(dāng)事件發(fā)生時(shí)接收通知的回調(diào)方法,例如 StartDocument, EndDocument, StartElement, EndElement, CharacterData等等。

org.xml.sax.helpers.DefaultHandler提供了ContentHandler接口的默認(rèn)實(shí)現(xiàn),因此我們可以繼承該類實(shí)現(xiàn)自己的處理類。繼承這個(gè)類是明智的選擇,因?yàn)槲覀兛赡苤恍枰獙?shí)現(xiàn)一些方法。繼承這個(gè)類可以保證代碼的簡(jiǎn)潔和可維護(hù)性。
下面是我們要解析的XML文檔:
employees.xml


    
        29
        Pankaj
        Male
        Java Developer
    
    
        35
        Lisa
        Female
        CEO
    
    
        40
        Tom
        Male
        Manager
    
    
        25
        Meghna
        Female
        Manager
    

該XML文件內(nèi)容存放一些員工的信息,每個(gè)員工包含id屬性和age, name, gender,role字段。
我們將使用SAX解析機(jī)制處理XML文件并創(chuàng)建員工對(duì)象列表。
我們使用Employee類抽象員工的信息:Employee.java

package com.journaldev.xml;public class Employee {
    private int id;    
    private String name;    
    private String gender;    
    private int age;    
    private String role;    
    public int getId() {        
    return id;
    }    public void setId(int id) {        
    this.id = id;
    }    public String getName() {        
    return name;
    }    public void setName(String name) {        
    this.name = name;
    }    public String getGender() {        
    return gender;
    }    public void setGender(String gender) {        
    this.gender = gender;
    }    public int getAge() {        
    return age;
    }    public void setAge(int age) {        
    this.age = age;
    }    public String getRole() {        
    return role;
    }    public void setRole(String role) {        
    this.role = role;
    }    @Override
    public String toString() {        
    return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +       
             " Role=" + this.role;
    }

}

接著繼承DefaultHandler類創(chuàng)建自己的Handler類MyHandler.java

package com.journaldev.xml.sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.journaldev.xml.Employee;
public class MyHandler extends DefaultHandler {

    //List to hold Employees object
    private List empList = null;    
    private Employee emp = null;    
    //getter method for employee list
    public List getEmpList() {        
    return empList;
    }    
    boolean bAge = false;    
    boolean bName = false;    
    boolean bGender = false;    
    boolean bRole = false;    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)            
    throws SAXException {        
    if (qName.equalsIgnoreCase("Employee")) {            
    //create a new Employee and put it in Map
            String id = attributes.getValue("id");            
            //initialize Employee object and set id attribute
            emp = new Employee();
            emp.setId(Integer.parseInt(id));            
            //initialize list
            if (empList == null)
                empList = new ArrayList<>();
        } else if (qName.equalsIgnoreCase("name")) {            
        //set boolean values for fields, will be used in setting Employee variables
            bName = true;
        } else if (qName.equalsIgnoreCase("age")) {
            bAge = true;
        } else if (qName.equalsIgnoreCase("gender")) {
            bGender = true;
        } else if (qName.equalsIgnoreCase("role")) {
            bRole = true;
        }
    }    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {        
    if (qName.equalsIgnoreCase("Employee")) {            
    //add Employee object to list
            empList.add(emp);
        }
    }    @Override
    public void characters(char ch[], int start, int length) throws SAXException {        
    if (bAge) {            
    //age element, set Employee age
            emp.setAge(Integer.parseInt(new String(ch, start, length)));
            bAge = false;
        } else if (bName) {
            emp.setName(new String(ch, start, length));
            bName = false;
        } else if (bRole) {
            emp.setRole(new String(ch, start, length));
            bRole = false;
        } else if (bGender) {
            emp.setGender(new String(ch, start, length));
            bGender = false;
        }
    }
}

MyHandler類持有一個(gè)存放Employee對(duì)象的List引用,它只有一個(gè)對(duì)應(yīng)的getter方法。Employee對(duì)象在事件處理函數(shù)中被添加到List對(duì)象,在MyHandler類中還定義了Employee對(duì)象和它的幾個(gè)字段相關(guān)的boolean類型變量用于創(chuàng)建Employee對(duì)象,當(dāng)Employee對(duì)象的所有屬性都被設(shè)置時(shí),它就會(huì)被添加到list中。
我們重寫了幾個(gè)重要的方法startElement(), endElement() 和characters().
當(dāng)SAXParser 開始解析文檔時(shí)遇到元素的開始標(biāo)簽時(shí),startElement() 方法就會(huì)被調(diào)用,我們重寫了這個(gè)方法,使用boolean類型變量來區(qū)分元素類別。我們也是在該方法中,當(dāng)Employee 標(biāo)簽開始時(shí)創(chuàng)建Employee 對(duì)象。
當(dāng)SAXParser遇到元素中的字符串?dāng)?shù)據(jù)時(shí)characters()方法會(huì)被調(diào)用,我們使用boolean類型字段為Employee對(duì)象的屬性進(jìn)行賦值。
endElement()方法則會(huì)在SAXParser 遇到XML結(jié)束標(biāo)簽時(shí)會(huì)被調(diào)用,在這里我們將Employee對(duì)象添加到List對(duì)象中。
在下面的測(cè)試程序中,我們使用MyHandler解析XML文檔生成存放Employee 對(duì)象List。
XMLParserSAX.java

package com.journaldev.xml.sax;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.journaldev.xml.Employee;
public class XMLParserSAX {

    public static void main(String[] args) {
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
        SAXParser saxParser = saxParserFactory.newSAXParser();
        MyHandler handler = new MyHandler();
        saxParser.parse(new File("/Users/pankaj/employees.xml"), handler);
        //Get Employees list
        List empList = handler.getEmpList();
        //print employee information
        for(Employee emp : empList)
            System.out.println(emp);
    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
    }

}

運(yùn)行程序輸出:

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: ID=2 Name=Lisa Age=35 
Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 
Gender=Male Role=ManagerEmployee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager

SAXParserFactory 類提供了工廠方法來獲取SAXParser 實(shí)例,在調(diào)用 SAXParser對(duì)象的parse方法時(shí)傳入Handler對(duì)象來處理回調(diào)事件。SAXParser解析機(jī)制剛開始接觸時(shí)有點(diǎn)復(fù)雜,但是當(dāng)你致力于處理大型的XML文檔時(shí),它比DOM解析提供了更有效的解析機(jī)制。
原文地址:http://www.php.cn/

Java SAX解析機(jī)制為我們提供了一系列的API來處理XML文件,SAX解析和DOM解析方式不太一樣,它并不是將XML文件內(nèi)容一次性全部加載,而是連續(xù)的部分加載。

javax.xml.parsers.SAXParser類提供了一些函數(shù),采用事件處理方式解析XML文檔,這個(gè)類實(shí)現(xiàn)了XMLReader接口,提供了重載的parse()方法從File,InputStream,SAX InputSource和URI字符串中讀取XML文檔。
實(shí)際的XML解析工作由Handler類來完成,我們需要?jiǎng)?chuàng)建自己的Handler類,這就需要我們實(shí)現(xiàn)org.xml.sax.ContentHandler接口。這個(gè)接口中包含當(dāng)事件發(fā)生時(shí)接收通知的回調(diào)方法,例如 StartDocument, EndDocument, StartElement, EndElement, CharacterData等等。

org.xml.sax.helpers.DefaultHandler提供了ContentHandler接口的默認(rèn)實(shí)現(xiàn),因此我們可以繼承該類實(shí)現(xiàn)自己的處理類。繼承這個(gè)類是明智的選擇,因?yàn)槲覀兛赡苤恍枰獙?shí)現(xiàn)一些方法。繼承這個(gè)類可以保證代碼的簡(jiǎn)潔和可維護(hù)性。
下面是我們要解析的XML文檔:
employees.xml


    
        29
        Pankaj
        Male
        Java Developer
    
    
        35
        Lisa
        Female
        CEO
    
    
        40
        Tom
        Male
        Manager
    
    
        25
        Meghna
        Female
        Manager
    

該XML文件內(nèi)容存放一些員工的信息,每個(gè)員工包含id屬性和age, name, gender,role字段。
我們將使用SAX解析機(jī)制處理XML文件并創(chuàng)建員工對(duì)象列表。
我們使用Employee類抽象員工的信息:Employee.java

package com.journaldev.xml;public class Employee {
    private int id;    
    private String name;    
    private String gender;    
    private int age;    
    private String role;    
    public int getId() {        
    return id;
    }    public void setId(int id) {        
    this.id = id;
    }    public String getName() {        
    return name;
    }    public void setName(String name) {        
    this.name = name;
    }    public String getGender() {        
    return gender;
    }    public void setGender(String gender) {        
    this.gender = gender;
    }    public int getAge() {        
    return age;
    }    public void setAge(int age) {        
    this.age = age;
    }    public String getRole() {        
    return role;
    }    public void setRole(String role) {        
    this.role = role;
    }    @Override
    public String toString() {        
    return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +         
           " Role=" + this.role;
    }

}

接著繼承DefaultHandler類創(chuàng)建自己的Handler類MyHandler.java

package com.journaldev.xml.sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.journaldev.xml.Employee;
public class MyHandler extends DefaultHandler {

    //List to hold Employees object
    private List empList = null;    
    private Employee emp = null;    
    //getter method for employee list
    public List getEmpList() {        
    return empList;
    }    
    boolean bAge = false;    
    boolean bName = false;    
    boolean bGender = false;    
    boolean bRole = false;    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)            
    throws SAXException {        
    if (qName.equalsIgnoreCase("Employee")) {            
    //create a new Employee and put it in Map
            String id = attributes.getValue("id");            
            //initialize Employee object and set id attribute
            emp = new Employee();
            emp.setId(Integer.parseInt(id));            
            //initialize list
            if (empList == null)
                empList = new ArrayList<>();
        } else if (qName.equalsIgnoreCase("name")) {            
        //set boolean values for fields, will be used in setting Employee variables
            bName = true;
        } else if (qName.equalsIgnoreCase("age")) {
            bAge = true;
        } else if (qName.equalsIgnoreCase("gender")) {
            bGender = true;
        } else if (qName.equalsIgnoreCase("role")) {
            bRole = true;
        }
    }    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {        
    if (qName.equalsIgnoreCase("Employee")) {            
    //add Employee object to list
            empList.add(emp);
        }
    }    @Override
    public void characters(char ch[], int start, int length) throws SAXException {        
    if (bAge) {            
    //age element, set Employee age
            emp.setAge(Integer.parseInt(new String(ch, start, length)));
            bAge = false;
        } else if (bName) {
            emp.setName(new String(ch, start, length));
            bName = false;
        } else if (bRole) {
            emp.setRole(new String(ch, start, length));
            bRole = false;
        } else if (bGender) {
            emp.setGender(new String(ch, start, length));
            bGender = false;
        }
    }
}

MyHandler類持有一個(gè)存放Employee對(duì)象的List引用,它只有一個(gè)對(duì)應(yīng)的getter方法。Employee對(duì)象在事件處理函數(shù)中被添加到List對(duì)象,在MyHandler類中還定義了Employee對(duì)象和它的幾個(gè)字段相關(guān)的boolean類型變量用于創(chuàng)建Employee對(duì)象,當(dāng)Employee對(duì)象的所有屬性都被設(shè)置時(shí),它就會(huì)被添加到list中。
我們重寫了幾個(gè)重要的方法startElement(), endElement() 和characters().
當(dāng)SAXParser 開始解析文檔時(shí)遇到元素的開始標(biāo)簽時(shí),startElement() 方法就會(huì)被調(diào)用,我們重寫了這個(gè)方法,使用boolean類型變量來區(qū)分元素類別。我們也是在該方法中,當(dāng)Employee 標(biāo)簽開始時(shí)創(chuàng)建Employee 對(duì)象。
當(dāng)SAXParser遇到元素中的字符串?dāng)?shù)據(jù)時(shí)characters()方法會(huì)被調(diào)用,我們使用boolean類型字段為Employee對(duì)象的屬性進(jìn)行賦值。
endElement()方法則會(huì)在SAXParser 遇到XML結(jié)束標(biāo)簽時(shí)會(huì)被調(diào)用,在這里我們將Employee對(duì)象添加到List對(duì)象中。
在下面的測(cè)試程序中,我們使用MyHandler解析XML文檔生成存放Employee 對(duì)象List。
XMLParserSAX.java

package com.journaldev.xml.sax;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.journaldev.xml.Employee;
public class XMLParserSAX {

    public static void main(String[] args) {
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
        SAXParser saxParser = saxParserFactory.newSAXParser();
        MyHandler handler = new MyHandler();
        saxParser.parse(new File("/Users/pankaj/employees.xml"), handler);
        //Get Employees list
        List empList = handler.getEmpList();
        //print employee information
        for(Employee emp : empList)
            System.out.println(emp);
    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
    }

}

運(yùn)行程序輸出:

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java 
DeveloperEmployee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 
Gender=Male Role=ManagerEmployee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager

SAXParserFactory 類提供了工廠方法來獲取SAXParser 實(shí)例,在調(diào)用 SAXParser對(duì)象的parse方法時(shí)傳入Handler對(duì)象來處理回調(diào)事件。SAXParser解析機(jī)制剛開始接觸時(shí)有點(diǎn)復(fù)雜,但是當(dāng)你致力于處理大型的XML文檔時(shí),它比DOM解析提供了更有效的解析機(jī)制。

上述內(nèi)容就是如何使用SAX方式解析XML文件,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


名稱欄目:如何使用SAX方式解析XML文件-創(chuàng)新互聯(lián)
文章鏈接:http://weahome.cn/article/dgsceh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部