##xml SAX 和 DOM解析

一、介紹及優(yōu)缺點(diǎn)分析

  1. DOM(Document Object Model)
    DOM是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)刑巧。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹(shù)中尋找特定信息斩芭。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu)洁闰,然后才能做任何工作。由于它是基于信息層次的皂吮,因而DOM被認(rèn)為是基于樹(shù)或基于對(duì)象的。
    【優(yōu)點(diǎn)】
    ①允許應(yīng)用程序?qū)?shù)據(jù)和結(jié)構(gòu)做出更改税手。
    ②訪問(wèn)是雙向的蜂筹,可以在任何時(shí)候在樹(shù)中上下導(dǎo)航,獲取和操作任意部分的數(shù)據(jù)芦倒。
    【缺點(diǎn)】
    ①通常需要加載整個(gè)XML文檔來(lái)構(gòu)造層次結(jié)構(gòu)艺挪,消耗資源大。
    1. SAX(Simple API for XML)
      SAX處理的優(yōu)點(diǎn)非常類(lèi)似于流媒體的優(yōu)點(diǎn)兵扬。分析能夠立即開(kāi)始麻裳,而不是等待所有的數(shù)據(jù)被處理。而且器钟,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù)津坑,因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)俱箱。事實(shí)上国瓮,應(yīng)用程序甚至不必解析整個(gè)文檔灭必;它可以在某個(gè)條件得到滿足時(shí)停止解析狞谱。一般來(lái)說(shuō),SAX還比它的替代者DOM快許多禁漓。
      選擇DOM還是選擇SAX跟衅? 對(duì)于需要自己編寫(xiě)代碼來(lái)處理XML文檔的開(kāi)發(fā)人員來(lái)說(shuō), 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策播歼。 DOM采用建立樹(shù)形結(jié)構(gòu)的方式訪問(wèn)XML文檔伶跷,而SAX采用的是事件模型掰读。
      DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹(shù),并可以對(duì)樹(shù)進(jìn)行遍歷叭莫。用DOM解析模型的優(yōu)點(diǎn)是編程容易蹈集,開(kāi)發(fā)人員只需要調(diào)用建樹(shù)的指令,然后利用navigation APIs訪問(wèn)所需的樹(shù)節(jié)點(diǎn)來(lái)完成任務(wù)雇初÷K粒可以很容易的添加和修改樹(shù)中的元素。然而由于使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔靖诗,所以對(duì)性能和內(nèi)存的要求比較高郭怪,尤其是遇到很大的XML文件的時(shí)候。由于它的遍歷能力刊橘,DOM解析器常用于XML文檔需要頻繁的改變的服務(wù)中鄙才。
      SAX解析器采用了基于事件的模型,它在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件促绵,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候攒庵,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到败晴。SAX對(duì)內(nèi)存的要求通常會(huì)比較低叙甸,因?yàn)樗岄_(kāi)發(fā)人員自己來(lái)決定所要處理的tag.特別是當(dāng)開(kāi)發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)位衩。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難裆蒸,而且很難同時(shí)訪問(wèn)同一個(gè)文檔中的多處不同數(shù)據(jù)。
      【優(yōu)勢(shì)】
      ①不需要等待所有數(shù)據(jù)都被處理糖驴,分析就能立即開(kāi)始僚祷。
      ②只在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),不需要保存在內(nèi)存中贮缕。
      ③可以在某個(gè)條件得到滿足時(shí)停止解析辙谜,不必解析整個(gè)文檔。
      ④效率和性能較高感昼,能解析大于系統(tǒng)內(nèi)存的文檔装哆。
      【缺點(diǎn)】
      ①需要應(yīng)用程序自己負(fù)責(zé)TAG的處理邏輯(例如維護(hù)父/子關(guān)系等),文檔越復(fù)雜程序就越復(fù)雜定嗓。
      ②單向?qū)Ш酵汕伲瑹o(wú)法定位文檔層次,很難同時(shí)訪問(wèn)同一文檔的不同部分?jǐn)?shù)據(jù)宵溅,不支持XPath凌简。
      二、解析xml dom
// 解析xml  sax
    func parseXml() {
        let path = Bundle.main.path(forResource: "index", ofType: "xml")
        let url = URL(fileURLWithPath: path!)
        let data = try! Data(contentsOf: url)
        print(data)
        // 創(chuàng)建xmlparser對(duì)象
        let xmlParser = XMLParser(data: data)
        xmlParser.delegate = self // delegate
        xmlParser.parse() // 開(kāi)始解析
    }
    
    // XMLParserDelegate
    // 開(kāi)始解析
    var arr: [Student]? = nil
    func parserDidStartDocument(_ parser: XMLParser) {
        print("開(kāi)始解析")
        // 初始化數(shù)組
        arr = [Student]()
    }
    
    // 獲取標(biāo)簽
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        print("name = " + elementName)
        // 當(dāng)發(fā)現(xiàn)student節(jié)點(diǎn)的時(shí)候,創(chuàng)建Student對(duì)象
        if elementName == "student" {
            let stu = Student()
            arr?.append(stu) // 存到到數(shù)組中
        }
        currentElement = elementName;
    }
    // 創(chuàng)建一個(gè)全局變量來(lái)傳遞節(jié)點(diǎn)
    var currentElement: String? = nil
    // 獲取值
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        // 去除空字符串
        let str =  string.trimmingCharacters(in: .whitespacesAndNewlines)
        if str == "" || str.isEmpty {
            return
        }
        print("String = " + string)
        // 如果是name節(jié)點(diǎn)
        if "name" == currentElement   {
            arr?.last?.name = str
        } else if ("age" == currentElement) {
            arr?.last?.age = Int(str)
        }
    }
    
    // 結(jié)束解析
    func parserDidEndDocument(_ parser: XMLParser) {
        print("結(jié)束解析")
        for item in arr! {
            print("item.name = \(item.name) item.age = \(item.age)")
        }
    }

三恃逻、 解析xml dom

// 解析xml dom
    func domXMl()  {
        let path = Bundle.main.path(forResource: "index", ofType: "xml")
        let url = URL(fileURLWithPath: path!)
        let data = try! Data(contentsOf: url)
        
        let dataXml = try! GDataXMLDocument(data: data, options: 0)
        // 獲取根節(jié)點(diǎn)
       let element = dataXml.rootElement() //Students
        // 獲取子節(jié)點(diǎn)
       let arr = element?.children() as! [GDataXMLElement]  // Student
        var StuArr:[Student] = [Student]() // 創(chuàng)建一個(gè)數(shù)組裝Student對(duì)象
        for stu in arr {  // stu 每一個(gè)student節(jié)點(diǎn)
            let stuent = Student()
            // 獲取name節(jié)點(diǎn)
           let ele = stu.elements(forName: "name") as![GDataXMLElement]
           stuent.name = ele.first?.stringValue()
           let ageEle = stu.elements(forName: "age") as![GDataXMLElement]
          stuent.age  = Int((ageEle.first?.stringValue())!)
            StuArr.append(stuent)
        }
        
        for item in StuArr {
           print("stu.name = \(item.name) stu.age = \(item.age)")
        }
    }
注意繼承 XMLParserDelegate
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雏搂,一起剝皮案震驚了整個(gè)濱河市藕施,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凸郑,老刑警劉巖裳食,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芙沥,居然都是意外死亡胞谈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)憨愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烦绳,“玉大人,你說(shuō)我怎么就攤上這事配紫【睹埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵躺孝,是天一觀的道長(zhǎng)享扔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)植袍,這世上最難降的妖魔是什么惧眠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮于个,結(jié)果婚禮上氛魁,老公的妹妹穿的比我還像新娘。我一直安慰自己厅篓,他們只是感情好秀存,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著羽氮,像睡著了一般或链。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上档押,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天澳盐,我揣著相機(jī)與錄音,去河邊找鬼令宿。 笑死叼耙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掀淘。 我是一名探鬼主播旬蟋,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼革娄!你這毒婦竟也來(lái)了倾贰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拦惋,失蹤者是張志新(化名)和其女友劉穎匆浙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厕妖,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡首尼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了言秸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片软能。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖举畸,靈堂內(nèi)的尸體忽然破棺而出查排,到底是詐尸還是另有隱情,我是刑警寧澤抄沮,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布跋核,位于F島的核電站,受9級(jí)特大地震影響叛买,放射性物質(zhì)發(fā)生泄漏砂代。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一率挣、第九天 我趴在偏房一處隱蔽的房頂上張望刻伊。 院中可真熱鬧,春花似錦椒功、人聲如沸娃圆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讼呢。三九已至,卻和暖如春谦炬,著一層夾襖步出監(jiān)牢的瞬間悦屏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工键思, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留础爬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓吼鳞,卻偏偏與公主長(zhǎng)得像看蚜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赔桌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • 1 XML解析No29 【 XML:可拓展標(biāo)記語(yǔ)言供炎,語(yǔ)言和HTML類(lèi)似渴逻,也是一種標(biāo)記語(yǔ)言。 特點(diǎn):標(biāo)記是自定義...
    征程_Journey閱讀 1,632評(píng)論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法音诫,類(lèi)相關(guān)的語(yǔ)法惨奕,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法竭钝,異常的語(yǔ)法梨撞,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,599評(píng)論 18 399
  • 解析的概念 解析:從事先規(guī)定好的格式中提取數(shù)據(jù)。 解析的前提:提前約定好格式香罐,數(shù)據(jù)提供方按照格式提供數(shù)據(jù)卧波,數(shù)據(jù)獲取...
    逗逗豆豆笑閱讀 1,152評(píng)論 2 14
  • 1. XML總結(jié) 1.1. XML簡(jiǎn)介 XML : 可擴(kuò)展的標(biāo)記語(yǔ)言。(和HTML非常類(lèi)似的) 可擴(kuò)展的庇茫。 自定義...
    Ethan_Walker閱讀 3,001評(píng)論 0 12
  • 解析的基本概念 解析: 從事先規(guī)定好的格式中提取數(shù)據(jù) 解析的前提: 提前約定好格式,數(shù)據(jù)提供方按照格式提供數(shù)據(jù),數(shù)...
    云之君兮鵬閱讀 1,843評(píng)論 4 28