一種xml文件檢索方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機技術(shù)領(lǐng)域,尤其涉及一種XML文件檢索方法及裝置。
【背景技術(shù)】
[0002]NodeJS是一個基于Google V8引擎建立的平臺,用于方便地搭建響應(yīng)速度快、易于擴展的網(wǎng)絡(luò)應(yīng)用。NodeJS使用事件驅(qū)動,非阻塞I/O模型而得以輕量和高效,非常適合在分布式設(shè)備上運行的數(shù)據(jù)密集型的實時應(yīng)用。NodeJS作為服務(wù)端應(yīng)用技術(shù),已經(jīng)慢慢成熟,社區(qū)中有大量的基于NodeJS的開源模塊,使得它使用起來方便了很多。
[0003]XML (extensible Markup Language)是一種簡單靈活的文本格式的可擴展標記語言,用于標記電子文件使其具有結(jié)構(gòu)性的標記語言,可以用來標記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標記語言進行定義的源語言。作為服務(wù)端技術(shù),XML作為配置文件和數(shù)據(jù)傳輸協(xié)議被大量使用,包含的內(nèi)容極其豐富。然而在NodeJS上使用JavaScript語言對XML信息的檢索很不方便。目前,也沒有像Dom4j這樣強大的解析工具來處理XML文件。作為XML的一種擴展,HTML (HyperText Markup Language,超級文本標記語言)作為頁面展示的主要技術(shù),文件的數(shù)量更是龐大,所包含的信息量更大,對這類文件的檢索需求必然是很大的。而NodeJS上對HTML的處理支持不是很好。
[0004]參見圖1,目前在NodeJS上解析XML文件時,通常將要操作的XML文件加載到內(nèi)存中,然后解析成Document對象,再進行DOM (Document Object Model文檔對象模型)操作。而通過Document解析器構(gòu)造D0M對象這種方式,需要將整個XML文件全部加載進內(nèi)存才能進行解析操作,如果文件比較大,對內(nèi)存消耗是非常大的;另外,構(gòu)造一個可操作的Document對象,需要將每個元素構(gòu)造成對象,對于比較大的文件效率會比較低。
【發(fā)明內(nèi)容】
[0005]本發(fā)明所要解決的技術(shù)問題在于提供一種XML文件檢索方法及裝置,用以解決現(xiàn)有技術(shù)在NodeJS上檢索XML大文件時內(nèi)存消耗嚴重甚至無法解析的問題。
[0006]依據(jù)本發(fā)明的一個方面,提供一種XML文件檢索方法,包括:
[0007]通過SAX解析器對輸入的XML字符串進行解析;
[0008]當解析到新的元素后,獲取元素的描述信息;
[0009]當獲取的所述描述信息與預(yù)先設(shè)置的檢索規(guī)則相匹配時,則將所述描述信息保存至結(jié)果集合,同時通知用戶處理檢索進程。
[0010]進一步地,在設(shè)置檢索規(guī)則時,包括:
[0011]利用樣式解析器對用戶輸入的樣式規(guī)則進行解析,并生成子樣式列表;
[0012]根據(jù)所述子樣式列表中的每一個子樣式構(gòu)造簡單選擇器;
[0013]根據(jù)子樣式之間的邏輯關(guān)系構(gòu)造邏輯選擇器;
[0014]所述簡單選擇器與所述邏輯選擇器組合成一個樣式選擇器,用于描述所述檢索規(guī)則。
[0015]進一步地,將獲取的所述描述信息與預(yù)先設(shè)置的檢索規(guī)則進行匹配時,包括:
[0016]獲取元素的描述信息,若所述描述信息符合所述簡單選擇器描述的規(guī)則,則繼續(xù)進行邏輯關(guān)系匹配;
[0017]當所述簡單選擇器滿足所述邏輯選擇器定義的邏輯關(guān)系時,則該元素匹配成功。
[0018]進一步地,所述方法包括:
[0019]當新的XML字符串輸入進來時,將所述XML字符串進行緩存后,再交由所述SAX解析器進行解析。
[0020]進一步地,所述方法包括:
[0021]當所述SAX解析器解析到新的元素開始時,將新元素壓入堆棧;
[0022]當所述SAX解析器解析到該元素的元素結(jié)束符時,將該元素出棧。
[0023]進一步地,所述方法包括:
[0024]當解析完一段XML后,將當前的元素棧進行緩存;
[0025]當有新的XML文件輸入時,則恢復(fù)使用之前緩存的所述元素棧。
[0026]依據(jù)本發(fā)明的一個方面,提供一種XML文件檢索裝置,包括:
[0027]解析模塊,用于通過SAX解析器對輸入的XML字符串進行解析;
[0028]獲取模塊,用于當解析到新的元素后,獲取元素的描述信息;
[0029]匹配模塊,用于當獲取的所述描述信息與預(yù)先設(shè)置的檢索規(guī)則相匹配時,則將所述描述信息保存至結(jié)果集合,同時通知用戶處理檢索進程。
[0030]進一步地,所述裝置還包括規(guī)則設(shè)置模塊:
[0031]用于在設(shè)置檢索規(guī)則時,利用樣式解析器對用戶輸入的樣式規(guī)則進行解析,并生成子樣式列表;
[0032]根據(jù)所述子樣式列表中的每一個子樣式構(gòu)造簡單選擇器;
[0033]根據(jù)子樣式之間的邏輯關(guān)系構(gòu)造邏輯選擇器;
[0034]所述簡單選擇器與所述邏輯選擇器組合成一個樣式選擇器,用于描述所述檢索規(guī)則。
[0035]進一步地,所述匹配模塊具體用于:
[0036]獲取元素的描述信息,若所述描述信息符合所述簡單選擇器描述規(guī)則,則繼續(xù)進行邏輯關(guān)系匹配;
[0037]當所述簡單選擇器之間的關(guān)系滿足所述邏輯選擇器定義的邏輯關(guān)系時,則該元素匹配成功。
[0038]進一步地,所述裝置包括第一緩存模塊:
[0039]用于當新的XML字符串輸入進來時,將所述XML字符串進行緩存后,再交由所述SAX解析器進行解析。
[0040]進一步地,所述裝置包括第二緩存模塊:
[0041]當所述SAX解析器解析到新的元素開始時,將新元素壓入堆棧;
[0042]當所述SAX解析器解析到該元素的元素結(jié)束符時,將該元素出棧。
[0043]進一步地,所述裝置包括第三緩存模塊:
[0044]用于當解析完一段XML后,將當前的元素棧進行緩存;
[0045]當有新的XML文件輸入時,則恢復(fù)使用之前緩存的所述元素棧。
[0046]本發(fā)明有益效果如下:
[0047]本發(fā)明通過采用SAX解析器,可以對XML文件邊解析邊處理,不需要將文件預(yù)先讀進內(nèi)存,可以有效節(jié)省內(nèi)存空間;以事件的方式通知檢索進度,可以更方便地控制檢索的進程;通過使用樣式選擇器作為對要查找的內(nèi)容的描述手段,可以表示出XML絕大部分的信息,非常通用,可以節(jié)省開發(fā)工作;基于樣式選擇器的特性,還可以解析HTML文件,對于前后臺HTML這種非結(jié)構(gòu)化數(shù)據(jù)的檢索用處會非常大。
[0048]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的【具體實施方式】。
【附圖說明】
[0049]為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0050]圖1為現(xiàn)有技術(shù)中,在NodeJS上解析XML文件的流程圖;
[0051]圖2為本發(fā)明實施例中,XML文件檢索方法的流程示意圖;
[0052]圖3為本發(fā)明實施例中,檢索器的工作流程示意圖;
[0053]圖4為本發(fā)明實施例中,設(shè)置檢索規(guī)則的流程示意圖;
[0054]圖5為本發(fā)明實施例中,對XML文件的檢索流程示意圖;
[0055]圖6為本發(fā)明實施例中,XM1文件檢索裝置的結(jié)構(gòu)示意圖。
【具體實施方式】
[0056]下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
[0057]為了解決在NodeJS上類非結(jié)構(gòu)化數(shù)據(jù)的檢索,尤其是體積比較大的XML文件的檢索問題,本發(fā)明提供一種基于JavaScript語言的XML文件檢索方法。該方法是采用SAX (Simple API for XML的縮寫,一種基于事件的解析XML的引擎)解析器邊解析邊處理,不需要預(yù)先將XML文件讀進內(nèi)存,可以有效節(jié)省內(nèi)存空間,同時本發(fā)明中檢索到相匹配的元素后,可以以事件的方式通知用戶,不需要將文件完全處理完后,再通知用戶檢索結(jié)果,用戶可以根據(jù)當前的檢索結(jié)果確定是否繼續(xù)檢索進程,更方便了檢索進程的控制。
[0058]如圖2所示,本發(fā)明提供的XML文件檢索方法,具體包括如下步驟:
[0059]步驟S101,SAX解析器對輸入的XML字符串進行解析;
[0060]步驟S102,當解析到新的元素后,獲取元素的描述信息;
[0061]步驟S103,當該描述信息與預(yù)先設(shè)置的檢索規(guī)則相匹配時,將該元素的描述信息保存至結(jié)果集合中,同時通知用戶處理檢索進程。
[0062]以下結(jié)合附圖以及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不限定本發(fā)明。
[0063]本發(fā)明中SAX解析器主要負責解析XML字符串,一遍掃描,一遍解析。當解析到新的元素時,以事件的方式將解析結(jié)果通知檢索器。檢索器是對外公開的對象,根據(jù)檢索規(guī)則匹配SAX解析器解析到的信息,以事件的方式向用戶通知檢索的進度及結(jié)果。
[0064]參見圖3,在進行解析前,檢索器需進行初始化。用戶通過應(yīng)用程序的輸入后,構(gòu)造檢索器對象。檢索器在初始化時,構(gòu)造SAX對象。SAX解析器對SAX對象進行解析生成SAX解析對象。檢索器根據(jù)SAX返回的SAX解析對象注冊檢索事件。該事件用于當SAX解析器解析到相應(yīng)元素后,通知檢索器進行匹配操作。檢索器注冊完檢索事件后,生成檢索器對象。應(yīng)用程序段根據(jù)該檢索器對象注冊監(jiān)聽事件。當檢索器檢索到匹配內(nèi)容后,以事件的方式通知應(yīng)用程序目前的檢索進度和結(jié)果。用戶可以更方便的控制檢索的進程,當找到要找的內(nèi)容后,可以立即停止檢索,而且也可以中途掛起,并且還可以恢復(fù)繼續(xù)執(zhí)行。
[0065]在檢索前,檢索器中預(yù)先設(shè)置檢索規(guī)則。如圖4所示,在設(shè)置規(guī)則時,用戶通過應(yīng)用程序設(shè)置需要的檢索規(guī)則。樣式解析器對用戶輸入的樣式規(guī)則進行解析,并生成子樣式列表。檢索器根據(jù)子樣式列表中的每一個子樣式構(gòu)造簡單選擇器,根據(jù)子樣式之間的邏輯關(guān)系構(gòu)造邏輯選擇器。這些簡單選擇器和邏輯選擇器最終組合成一個樣式選擇器(CSSSelector),形成一顆選擇器樹,最外層的那個選擇器是樹根,所有簡單選擇器是葉子節(jié)點,而邏輯選擇器則是樹枝。選擇器樹就可以表示出用戶輸入的所有檢索規(guī)則。
[0066]具體地,簡單選擇器是是原子的不可再分的最小匹配單元,例如,包括元素名、元素的屬性以及該元素所包含的文本內(nèi)容