日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

第六章、epub文件处理 -- 解析container文件与.opf文件

發(fā)布時(shí)間:2024/4/14 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六章、epub文件处理 -- 解析container文件与.opf文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

第六章、epub文件處理?--?解析container文件與.opf文件

?

這一章我們會(huì)接著第三章結(jié)尾介紹的FBReaderApp類(lèi)的openBookInternal繼續(xù),開(kāi)始介紹解析container文件與.opf文件。

這一章中會(huì)涉及到第二章、第四章、第五章中介紹的內(nèi)容,大家可以互相參照,加深理解

首先,我們來(lái)回顧下第四章“epub文件處理?--?epub文件內(nèi)部組成”的內(nèi)容。我們?cè)诘谒恼轮性?jīng)介紹過(guò),epub文內(nèi)部包含的文件包括“container.xml文件、.opf文件、.ncx文件、.xhtml文件”。這些文件都是被壓縮過(guò)的xml文件,而在這些不同的xml文件中包含著不同的標(biāo)簽,每種標(biāo)簽又都代表著不同的信息。為了對(duì)每種xml文件的標(biāo)簽作統(tǒng)一處理,FBReader程序?qū)γ糠N文件都設(shè)置了對(duì)應(yīng)的類(lèi)。每種類(lèi)就專(zhuān)門(mén)處理來(lái)對(duì)應(yīng)的xml文件里面的標(biāo)簽。


ContainerFileReader類(lèi)對(duì)應(yīng)container.xml文件;OEBBookReader類(lèi)對(duì)應(yīng).opf文件; NCXReader類(lèi)對(duì)應(yīng).ncx文件文件;XHTMLReader類(lèi)對(duì)應(yīng).xhtml文件。

PS:這些類(lèi)都是ZLXMLReaderAdapter抽象類(lèi)的子類(lèi),本章會(huì)涉及到ContainerFileReader類(lèi)與OEBBookReader類(lèi)

我們?cè)诘谒恼轮羞€曾經(jīng)分別介紹過(guò)container文件與.opf文件分別的作用。

container文件的“作用就是標(biāo)明了.opf文件的位置”;.opf文件則描述了epub書(shū)籍的元信息、epub文件內(nèi)部對(duì)應(yīng)不同章節(jié)對(duì)應(yīng)的文件的位置以及每個(gè)章節(jié)出現(xiàn)的先后次序。

我們這一章解析這兩種文件,就是為了獲取這些信息。



在介紹解析流程之前,我們還需要再回顧下解析xml文件的三個(gè)核心類(lèi)。這個(gè)部分內(nèi)容,我們?cè)?jīng)在第二章“解析資源文件”中介紹過(guò)。當(dāng)時(shí),我們是這么介紹的:“

繼續(xù)回到解析xml文件的核心類(lèi)ZMLZMLProcessor、ZLXMLParser、ZLXMLReader。

這三個(gè)核心類(lèi)的調(diào)用順序一般是這樣的:

?1ZLXMLReaderAdapter抽象類(lèi)的子類(lèi)ResourceTreeReader類(lèi))里面的read方法調(diào)用ZLXMLProcessor類(lèi)的read方法

2、ZLXMLProcessor類(lèi)的read方法通過(guò)AndroidAssetsFile類(lèi)(ZLResourceFile類(lèi)的子類(lèi))的getInputStream方法獲取一個(gè)針對(duì)資源文件的字節(jié)流類(lèi)(AssetInputStream類(lèi)),并以這個(gè)字節(jié)流類(lèi)為參數(shù)初始化了一個(gè)針對(duì)資源文件的字符流類(lèi)。接著,就調(diào)用了ZLXMLParser類(lèi)的doIt方法。

3、?ZLXMLParser類(lèi)的doIt方法利用字符流類(lèi)將文件轉(zhuǎn)換成一個(gè)char數(shù)組。再利用for循環(huán)迭代byte數(shù)組的過(guò)程中,doIt方法又反過(guò)來(lái)調(diào)用ZLXMLReader接口實(shí)現(xiàn)類(lèi)(ResourceTreeReader類(lèi))的startElementHandler與endElementHandler方法對(duì)byte數(shù)組中元素所代表的不同節(jié)點(diǎn)進(jìn)行操作。

?

請(qǐng)注意,上面這段話標(biāo)紅的部分,這些部分在解析epub內(nèi)部文件的流程中已經(jīng)不適用了。

1、ZLXMLReaderAdapter抽象類(lèi)的子類(lèi)ContainerFileReader類(lèi)、OEBBookReader類(lèi)、NCXReader類(lèi)、XHTMLReader類(lèi)中的一種)里面的read方法調(diào)用ZLXMLProcessor類(lèi)的read方法

2、ZLXMLProcessor類(lèi)的read方法通過(guò)ZLZipEntryFile類(lèi)的getInputStream方法和ZLZipEntryFile類(lèi)對(duì)應(yīng)的LocalFileHeader類(lèi)獲取一個(gè)針對(duì)epub內(nèi)部xml文件的字節(jié)流類(lèi)(ZipInputStream類(lèi)),并以這個(gè)字節(jié)流類(lèi)為參數(shù)初始化了一個(gè)針對(duì)資源文件的字符流類(lèi)。接著,就調(diào)用了ZLXMLParser類(lèi)的doIt方法。

3、?ZLXMLParser類(lèi)的doIt方法利用字符流類(lèi)將文件轉(zhuǎn)換成一個(gè)char數(shù)組(第五章用一整個(gè)章節(jié)介紹了這個(gè)轉(zhuǎn)換的流程)。再利用for循環(huán)迭代byte數(shù)組的過(guò)程中,doIt方法又反過(guò)來(lái)調(diào)用ZLXMLReader接口實(shí)現(xiàn)類(lèi)(ResourceTreeReader類(lèi))的startElementHandler與endElementHandler方法對(duì)byte數(shù)組中元素所代表的不同節(jié)點(diǎn)進(jìn)行操作。

首先,“ZLXMLReaderAdapter抽象類(lèi)的子類(lèi)”已經(jīng)不再是那個(gè)ResourceTreeReader類(lèi)了,而是專(zhuān)門(mén)對(duì)應(yīng)epub內(nèi)部各種xml文件的一個(gè)類(lèi)(ContainerFileReader類(lèi)、OEBBookReader類(lèi)、NCXReader類(lèi)、XHTMLReader類(lèi)中的一種)。

PS:ResourceTreeReader類(lèi)是程序?qū)iT(mén)為處理資源文件內(nèi)部的標(biāo)簽而創(chuàng)建的類(lèi)

其次,程序在解析epub內(nèi)部xml文件的時(shí)候,不會(huì)去獲取“針對(duì)資源文件的字節(jié)流類(lèi)”,而是會(huì)通過(guò)調(diào)用ZLZipEntryFile類(lèi)的getInputStream方法獲取針對(duì)epub內(nèi)部xml文件的字節(jié)流類(lèi)(ZipInputStream類(lèi))。相對(duì)得,之后也會(huì)以這個(gè)字節(jié)流類(lèi)來(lái)獲得對(duì)應(yīng)的字符流類(lèi)。

PS:ZLZipEntryFile類(lèi)的getInputStream方法的具體處理流程我們?cè)?jīng)用了第五章“XML文件處理?--?解壓”一整章來(lái)作介紹



好了,下面我們就正式開(kāi)始解析流程。

?

FBReaderApp類(lèi)的openBookInternal方法中會(huì)調(diào)用BookModel類(lèi)的createModel方法。


crateModel方法,會(huì)調(diào)用PluginCollection類(lèi)的getPlugin方法

getPlugin方法調(diào)用了所有FormatPlugin抽象類(lèi)子類(lèi)的acceptsFile方法,這個(gè)方法其實(shí)就是比較了Book類(lèi)中File屬性指向的File類(lèi)的myExtension屬性(這個(gè)屬性的賦值我們?cè)诘谌隆矮@取書(shū)籍信息”中介紹過(guò)),如果myExtension屬性代碼內(nèi)置的變量相同,getPlugin方法就會(huì)返回當(dāng)前的FormatPlugin抽象類(lèi)子類(lèi)。而在處理epub文件時(shí),代碼會(huì)返回OEBPlugin類(lèi)。




OEBPlugin類(lèi)readModel方法

獲得了OEBPlugin類(lèi)之后,代碼就會(huì)調(diào)用該類(lèi)中的readModel方法。



readModel方法調(diào)用了兩個(gè)方法:OEBPlugin類(lèi)的getOpfFile方法與OEBBookReader類(lèi)readBook方法



OEBPlugin類(lèi)的getOpfFile方法:

getOpfFile方法一共有三步:

第一步 ? ?

調(diào)用ZLFile類(lèi)的createFile方法

這個(gè)方法的參數(shù)oebFile參數(shù)是Book類(lèi)的File屬性(這個(gè)屬性的賦值過(guò)程在第三章“獲取書(shū)籍信息”介紹過(guò)),最終這個(gè)方法會(huì)返回一個(gè)代表container.xml文件的ZLZipEntryFile類(lèi)。

我們?cè)?jīng)在第二章“解析資源文件”中介紹過(guò):“ZLZipEntryFile類(lèi)用來(lái)處理epub文件內(nèi)部的xml文件”。也曾經(jīng)在第四章“epub文件處理?--?epub文件內(nèi)部組成”介紹過(guò)container.xml文件,這個(gè)文件的作用就是“標(biāo)明了.opf文件的位置”。

我們從代碼中可以看到,代表container.xml文件的ZLZipEntryFile會(huì)包含兩個(gè)屬性(85行):一個(gè)代表epub文件的ZLPhysicalFile類(lèi),一個(gè)代表epub內(nèi)部xml文件名種子的String變量(在這里就是)。


第二步

ContainerFileReader類(lèi)的read方法。

看到這個(gè)方法,你應(yīng)該會(huì)記起這一章開(kāi)頭介紹的“解析epub內(nèi)部文件的流程”吧。

1、ZLXMLReaderAdapter抽象類(lèi)的子類(lèi)(ContainerFileReader類(lèi)、OEBBookReader類(lèi)、NCXReader類(lèi)、XHTMLReader類(lèi)中的一種)里面的read方法調(diào)用ZLXMLProcessor類(lèi)的read方法

2、ZLXMLProcessor類(lèi)的read方法通過(guò)ZLZipEntryFile類(lèi)的getInputStream方法和ZLZipEntryFile類(lèi)對(duì)應(yīng)的LocalFileHeader類(lèi)獲取一個(gè)針對(duì)epub內(nèi)部xml文件的字節(jié)流類(lèi)(ZipInputStream類(lèi)),并以這個(gè)字節(jié)流類(lèi)為參數(shù)初始化了一個(gè)針對(duì)資源文件的字符流類(lèi)。接著,就調(diào)用了ZLXMLParser類(lèi)的doIt方法。

3、?ZLXMLParser類(lèi)的doIt方法利用字符流類(lèi)將文件轉(zhuǎn)換成一個(gè)char數(shù)組(第五章用一整個(gè)章節(jié)介紹了這個(gè)轉(zhuǎn)換的流程)。再利用for循環(huán)迭代byte數(shù)組的過(guò)程中,doIt方法又反過(guò)來(lái)調(diào)用ZLXMLReader接口實(shí)現(xiàn)類(lèi)(ResourceTreeReader類(lèi))的startElementHandler與endElementHandler方法對(duì)byte數(shù)組中元素所代表的不同節(jié)點(diǎn)進(jìn)行操作。

在這個(gè)解析流程中, .opf 文件的位置信息會(huì)被存儲(chǔ)到 ContainerFileReader 類(lèi)的 myRootPath 屬性( 35 行)



第三步

代碼以包含.opf的位置信息的String為參數(shù)又調(diào)用了ZLFile類(lèi)的createFile方法,這個(gè)方法會(huì)返回代表.opf文件的ZLZipEntryFile類(lèi),獲取這個(gè)類(lèi)之后,代碼會(huì)進(jìn)入OEBBookReader類(lèi)readBook方法


OEBBookReader類(lèi)readBook方法:

這個(gè)方法分為兩步:第一步、更新myHtmlFileNames屬性;第二步、for循環(huán)迭代myHtmlFileNames屬性指向的ArrayList,解析xhtml文件。

第一步

更新myHtmlFileNames屬性

OEBBookReader類(lèi)的read方法更新了myHtmlFileNames屬性。


OEBBookReader類(lèi)的read方法用讓代碼進(jìn)入了解析xml文件的流程:

1、ZLXMLReaderAdapter抽象類(lèi)的子類(lèi)(ContainerFileReader類(lèi)、OEBBookReader類(lèi)、NCXReader類(lèi)、XHTMLReader類(lèi)中的一種)里面的read方法調(diào)用ZLXMLProcessor類(lèi)的read方法

2、ZLXMLProcessor類(lèi)的read方法通過(guò)ZLZipEntryFile類(lèi)的getInputStream方法和ZLZipEntryFile類(lèi)對(duì)應(yīng)的LocalFileHeader類(lèi)獲取一個(gè)針對(duì)epub內(nèi)部xml文件的字節(jié)流類(lèi)(ZipInputStream類(lèi)),并以這個(gè)字節(jié)流類(lèi)為參數(shù)初始化了一個(gè)針對(duì)資源文件的字符流類(lèi)。接著,就調(diào)用了ZLXMLParser類(lèi)的doIt方法。

3、?ZLXMLParser類(lèi)的doIt方法利用字符流類(lèi)將文件轉(zhuǎn)換成一個(gè)char數(shù)組(第五章用一整個(gè)章節(jié)介紹了這個(gè)轉(zhuǎn)換的流程)。再利用for循環(huán)迭代char數(shù)組的過(guò)程中,doIt方法又反過(guò)來(lái)調(diào)用ZLXMLReader接口實(shí)現(xiàn)類(lèi)(ResourceTreeReader類(lèi))的startElementHandler與endElementHandler方法對(duì)byte數(shù)組中元素所代表的不同節(jié)點(diǎn)進(jìn)行操作。

我們?cè)?jīng)在第四章“epub文件處理?--?epub文件內(nèi)部組成”中介紹過(guò).opf文件中的“manifest節(jié)點(diǎn)的作用是描述epub文件內(nèi)部對(duì)應(yīng)不同章節(jié)對(duì)應(yīng)的文件的位置”。


我們現(xiàn)在就是要把這些位置信息存儲(chǔ)到myHtmlFileNames屬性指向的ArrayList中。而這個(gè)工作是OEBBookReader類(lèi)的startElementHandler方法中完成的。


第二步

for循環(huán)迭代myHtmlFileNames屬性指向的ArrayList,解析xhtml文件

ZLFile類(lèi)的createFileByPath方法會(huì)生成代表xhtml文件的ZLZipEntryFile類(lèi)。之后XHTMLReader類(lèi)的readFile方法會(huì)開(kāi)始對(duì)xhtml文件的解析。


XHTMLReader類(lèi)的readFile方法會(huì)調(diào)用本類(lèi)的read方法。這個(gè)方法又會(huì)讓代碼進(jìn)入解析xml文件的流程。這個(gè)流程我們?cè)诒菊轮幸呀?jīng)多次遇到了。走完這個(gè)流程,我們就會(huì)得到一個(gè)有xml文件轉(zhuǎn)換成的char數(shù)組。代碼循環(huán)迭代這個(gè)char數(shù)組,調(diào)用XHTMLReader類(lèi)的startElementHandler與endElementHandler方法對(duì)byte數(shù)組中元素所代表的不同節(jié)點(diǎn)進(jìn)行操作。


對(duì)xhtml文件中各節(jié)點(diǎn)的操作比container.xml與.opf文件的操作要復(fù)雜很多,我們將用兩個(gè)章節(jié)來(lái)介紹。




轉(zhuǎn)載于:https://my.oschina.net/u/938986/blog/335878

總結(jié)

以上是生活随笔為你收集整理的第六章、epub文件处理 -- 解析container文件与.opf文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。