XML轉(zhuǎn)換為JAVA

將XML文檔中的內(nèi)容轉(zhuǎn)換為JAVA對(duì)象共有4中方式它,它們分別是DOM注益,SAX舶沿,DOM4J 墙杯, JDOM。接下來(lái)我用代碼演示JAVA官方提供我們的兩種方式DOM和SAX括荡。
DOM是JDK自帶的接下來(lái)我來(lái)演示一下怎樣獲取XML文本中的內(nèi)容高镐。以下是xml文件中的內(nèi)容。

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student id="1508022226" stuid="123">
        <name>張三</name>
        <age>12</age>
     </student>

    <student id="1508022223" stuid="456">
        <name>李四</name>
        <age>16</age>
    </student>
</students>

我們通過(guò)DOM的方式來(lái)獲取來(lái)獲取xml文件中的內(nèi)容畸冲。

public class DOMDemo01 {
    private static DocumentBuilderFactory documentBuilderFactory ;
    private static DocumentBuilder documentBuilder;
    private static Document document;

    public static void main(String[] args) {
        documentBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            documentBuilder = documentBuilderFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        try {
            document = documentBuilder.parse("src/main/resources/xml/student.xml");
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        NodeList parents =  document.getElementsByTagName("student");
        System.out.println("一共有"+parents.getLength()+"個(gè)節(jié)點(diǎn)");
        for(int i=0;i<parents.getLength();i++){
           Element students = (Element) parents.item(i);
           //獲取父標(biāo)簽中的值
           String id = students.getAttribute("id");
           String stuid = students.getAttribute("stuid");
           System.out.println("id : "+id+"  stuid : "+stuid);

           //獲取子標(biāo)簽
           NodeList childs = students.getChildNodes();
           //DOM將空白和文件也看作為節(jié)點(diǎn)    // System.out.println(childs.getLength());

            //打印student節(jié)點(diǎn)的所有標(biāo)簽
            for(int j=0;j<childs.getLength();j++){
                //獲取除文本節(jié)點(diǎn)和空格節(jié)點(diǎn)
                if(childs.item(j).getNodeType() == Node.ELEMENT_NODE){
                    Student student = new Student();
                    System.out.print(childs.item(j).getNodeName() + " : ");
                    //通過(guò)childs.item(j).getTextContent()也可以獲取節(jié)點(diǎn)內(nèi)容
                    System.out.println(childs.item(j).getFirstChild().getNodeValue());
                }
            }
           
        }
    }
}

以下是輸出的內(nèi)容


image.png

SAX解析XML文件

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;

public class SAXDemo {
    public static void main(String[] args) {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            SAXHandle saxHandle = new SAXHandle();
            parser.parse("src/main/resources/xml/student.xml",saxHandle);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class SAXHandle extends DefaultHandler {

    /*
     *  用來(lái)表示解析的開始
     */
    @Override
    public void startDocument () throws SAXException {
        super.startDocument();
        System.out.println("解析標(biāo)簽開始");
    }

    @Override
    public void endDocument () throws SAXException {
        super.startDocument();
        System.out.println("解析標(biāo)簽結(jié)束");
    }

    @Override
    public void startElement (String uri, String localName, String qName,
                              Attributes attributes) throws SAXException {
        super.startElement(uri,localName,qName,attributes);

        if(qName.equals("student") ){
            int length = attributes.getLength();
            for(int i=0;i<length;i++){
                System.out.print(attributes.getQName(i)+" : ");
                System.out.print(attributes.getValue(i)+"     ");
            }
            System.out.println();
        }else if(!qName.equals("student")){
            System.out.print("節(jié)點(diǎn)名 : "+qName +"  ");
        }

    }
    /*
     *  用來(lái)表示解析的結(jié)束
     */
    @Override
    public void endElement (String uri, String localName, String qName)
            throws SAXException {
        super.endElement(uri,localName,qName);
    }


    @Override
    public void characters (char ch[], int start, int length)
            throws SAXException {
        String value = new String(ch,start,length);
        //去掉換行和空制符
        if(!value.trim().equals("")){
            System.out.println(value);
        }
    }

}

運(yùn)行結(jié)果


image.png

總結(jié):DOM解析將文件的內(nèi)容全部加載在內(nèi)存中并且形成一個(gè)DOM樹嫉髓,如果XML非常大,則DOM很浪費(fèi)時(shí)間邑闲。SAX是基于事件的解析算行,會(huì)一步一步的判斷每一行的XML文件中的內(nèi)容,執(zhí)行開始標(biāo)簽觸發(fā)startDocument()方法苫耸,每走到結(jié)束標(biāo)簽都會(huì)觸發(fā)一個(gè)endDocument方法州邢。執(zhí)行完最后標(biāo)簽會(huì)執(zhí)行endDocument方法。
DOM
優(yōu)點(diǎn):形成DOM樹褪子,實(shí)現(xiàn)簡(jiǎn)單量淌。
缺點(diǎn): 當(dāng)XML文件非常大時(shí),對(duì)內(nèi)存消耗比較大嫌褪,容易影響解析呀枢,容易造成內(nèi)存溢出。
SAX
優(yōu)點(diǎn):采用事件的驅(qū)動(dòng)模式笼痛,不需要關(guān)系賦值節(jié)點(diǎn)裙秋,按行進(jìn)行解析琅拌。
缺點(diǎn):不易編碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摘刑,一起剝皮案震驚了整個(gè)濱河市进宝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泣侮,老刑警劉巖即彪,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異活尊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)漏益,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蛹锰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绰疤,你說(shuō)我怎么就攤上這事铜犬。” “怎么了轻庆?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵癣猾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我余爆,道長(zhǎng)纷宇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任蛾方,我火速辦了婚禮像捶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桩砰。我一直安慰自己拓春,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布亚隅。 她就那樣靜靜地躺著硼莽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煮纵。 梳的紋絲不亂的頭發(fā)上懂鸵,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音醉途,去河邊找鬼矾瑰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隘擎,可吹牛的內(nèi)容都是我干的殴穴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼采幌!你這毒婦竟也來(lái)了劲够?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤休傍,失蹤者是張志新(化名)和其女友劉穎征绎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磨取,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡人柿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忙厌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凫岖。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逢净,靈堂內(nèi)的尸體忽然破棺而出哥放,到底是詐尸還是另有隱情,我是刑警寧澤爹土,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布甥雕,位于F島的核電站,受9級(jí)特大地震影響胀茵,放射性物質(zhì)發(fā)生泄漏社露。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一宰掉、第九天 我趴在偏房一處隱蔽的房頂上張望呵哨。 院中可真熱鬧,春花似錦轨奄、人聲如沸孟害。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挨务。三九已至,卻和暖如春玉组,著一層夾襖步出監(jiān)牢的瞬間谎柄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惯雳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朝巫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓石景,卻偏偏與公主長(zhǎng)得像劈猿,于是被迫代替她去往敵國(guó)和親拙吉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一. XML數(shù)據(jù)交換格式 XML數(shù)據(jù)交換格式是一種自描述的數(shù)據(jù)交互格式揪荣,雖然XML數(shù)據(jù)格式不如JSON "輕便"筷黔,...
    __season____閱讀 2,517評(píng)論 0 7
  • 什么是XML? XML:extensiable markup language 被稱作可擴(kuò)展標(biāo)記語(yǔ)言 XML簡(jiǎn)單的...
    Java3y閱讀 2,418評(píng)論 5 41
  • 1. XML總結(jié) 1.1. XML簡(jiǎn)介 XML : 可擴(kuò)展的標(biāo)記語(yǔ)言仗颈。(和HTML非常類似的) 可擴(kuò)展的佛舱。 自定義...
    Ethan_Walker閱讀 3,041評(píng)論 0 12
  • 吸引力法則 每個(gè)人都渴望得到別人的尊重。但要得到別人的尊重挨决,就要先尊重自己请祖,愛(ài)自己。如果你連這個(gè)都做不到凰棉,你就是在...
    緣來(lái)是緣8閱讀 214評(píng)論 0 0
  • 每天早讀時(shí)损拢,我總愛(ài)給孩子們布置兩種背誦任務(wù):任務(wù)和超任務(wù)。 任務(wù):一般有二到三個(gè)比較簡(jiǎn)單的要背誦的內(nèi)容撒犀,保證大部分...
    澠池3112王莉莉閱讀 362評(píng)論 3 1